使用timeit时无法将列表传递给此Python函数
我编写了一个小脚本来生成具有不同输入的函数的运行时间。我的目的是绘制数字,并向自己证明函数确实具有二次运行时间。代码如下:使用timeit时无法将列表传递给此Python函数,python,algorithm,timeit,Python,Algorithm,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 # Quadrati
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
都引用全局subseq
,该函数为空。如何将此子序列正确传递到此函数
注意:我也可以使用另一个工具来完成这项工作,只要它能给我函数每次迭代的精确运行时间(以使用的CPU时间计算)。默认情况下,Python认为
subseq
是函数的局部变量。此局部名称隐藏了将参数传递给timeit
timer的全局变量
要使赋值操作全局可见,您需要将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
语句运行所花费的时间也将被计算在内,但是,这不会显著改变结果,最重要的是,不会使它失去二次上下文@Rogalski这就是我通过查看timeit
示例得到的感觉:需要导入函数名和变量,以便可以通过timeit
设置单独的虚拟环境。你推荐什么?谢谢!这也是一个非常巧妙的方法。