我正在對一些簡單的階乘演算法進行一些演算法運行時間分析,為了避免代碼重復,我試圖創建一個單一的時間分析函式,它將不同的階乘演算法函式作為引數。
當我傳入只接受一個引數的階乘函式(例如迭代)時,這可以正常作業,但作為我作業的一部分,我還必須使用尾遞回演算法,它需要 2 個引數(n,累加器)。這是我的代碼:
def iterFactorial(n):
#running product
factorial = 1
#multiply each number in range 1 to n by the running product(i.e. the factorial)
for i in range(1,n 1):
factorial *= i
#return the factorial
return factorial
def tail_Recur_Factorial(n,accumulator):
if n == 1:
return accumulator
return tail_Recur_Factorial(n-1,n*accumulator)
running_times_1 = []
n_values = [i for i in range(1,1000,100)]
def TimeAnalyis(function):
#array for storing multiple temporary running times of algorithm for a given n
temp_time = [0]
for n in n_values:
#run fucntion 50 times for each given n value
for i in range(50):
#take current timestamp
start_time = time.time()
#run function
function(n)
#take current timestamp
end_time = time.time()
#calculate time taken for function to run
function_time = end_time - start_time
#append to temp time array so mean can be taken
temp_time.append(function_time)
#take average running time
running_times_1.append(statistics.mean(temp_time))
#reset temp time
temp_time = [0]
時間分析函式適用于迭代階乘函式,我稱之為:
時間分析(iterFactorial)
如何修改時間分析函式以允許我也傳遞帶有兩個引數的尾部遞回函式?
uj5u.com熱心網友回復:
代碼:
您可以為此創建一個裝飾器。
def TimeAnalyis(func):
#Takes any number of args and kwargs
def wrapper(*args,**kargs):
best = float('inf')
for i in range(50):
start = time.time()
# Calls function and stores returned values in result
result = func(*args,**kargs)
total = time.time()-start
if total<best:
best = total
# Print best timing
print(f'Best time taken is {best} seconds')
# returns the values returned by function
return result
# returns wrapper function
return wrapper
#decorator
@TimeAnalyis
def anyfunc(n,m):
for i in range(n):
print(i*m)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/437636.html
