![](/img/trans.png)
[英]How to pass a list as parameter function into a timeit call in Python 3.2.3?
[英]Unable to pass list to this Python function when using timeit
我編寫了一個小腳本來生成具有不同輸入的函數的運行時間。 我的目的是繪制數字,並向我證明該函數確實具有二次運行時間。 這是代碼:
import timeit
seq = [875011, 549220, 400865, 913974, 699921, 108386, 328934, 593902, 805659, 916502, 597662]
subseq = []
num = 1000000 # How many times the algorithm must run
# Quadratic running time
def quad (S):
n = len(S)
A = [0] * n
for j in range(n):
total = 0
for i in range(j+1):
total += S[i]
A[j] = total / (j+1)
return A
def plot_func (name):
print('\n')
for i in range(len(seq)):
subseq = seq[0:i+1]
t = timeit.Timer('{}(subseq)'.format(name), 'from __main__ import {}, subseq'.format(name))
print(t.timeit(number=num))
plot_func('quad')
問題在於運行時間不會變化,這是因為每次運行時,函數quad
引用為空的global subseq
。 如何正確地將此子序列傳遞給此函數?
PS:我也可以使用其他工具來完成這項工作,只要它可以為我提供該函數每次迭代的確切運行時間(就使用的CPU時間而言)。
默認情況下,Python認為subseq
是函數局部變量。 此本地名稱隱藏了將參數傳遞給timeit
計時器的全局變量。
為了使賦值操作在全局范圍內可見,需要在函數中使用subseq
變量之前將其聲明為global
變量:
def plot_func (name):
global subseq
print('\n')
for i in range(len(seq)):
subseq = seq[0:i+1]
將代碼與通常要度量的代碼分開並不是一個好主意。
由於您的目標只是衡量算法以檢查結果,因此我建議您在timeit
范圍內運行所有內容,如下所示
import timeit
num = 1000000 # How many times the algorithm must run
setup = """
seq = [875011, 549220, 400865, 913974, 699921, 108386, 328934, 593902, 805659, 916502, 597662]
subseq = []
# Quadratic running time
def quad (S):
n = len(S)
A = [0] * n
for j in range(n):
total = 0
for i in range(j+1):
total += S[i]
A[j] = total / (j+1)
return A
"""
run_function = """
def plot_func (name):
print('\n')
for i in range(len(seq)):
subseq = seq[0:i+1]
print(t.timeit(number=num))
plot_func('quad')
"""
timeit.timeit(stmt=run_function, setup=setup, number=num)
這樣,timeit將在其作用域內設置所有內容,並在其中運行您定義的函數。
重要的是要注意,從print
語句開始到運行所花費的時間也將被計算在內,但這不會顯着改變結果,最重要的是,不會使它失去二次上下文
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.