我正在努力使用Python中的timeit函数,而且在更深层次上,我发现自己对这个函数的怪癖感到非常沮丧。我希望我能在这里得到一些帮助。
我有一个带有许多不同函数定义的脚本(称之为my_script.py
),然后在它们下面计算了很多其他的东西。我想特别只计算其中一个函数 - 让我们称之为level_99_function(x)
。我在my_input
中存储了一个大数组。我的第一次尝试:
timeit.timeit('f1(x)', setup = 'my_input')
Python返回错误:NameError: global name 'angle' is not defined
。
现在我的第二次尝试是执行以下操作:
print timeit.timeit('level_99_function(x)', setup = 'import numpy as np; import my_script.py; x= np.linspace(0,100)')
这不会产生任何错误,但问题是双重的。首先,最重要的是,它仍然没有时间level_99_function
(或者它可能只是因为某种原因不打印到计时器的输出?)其次,import
语句似乎正在运行导入时的整个脚本,由于除了level_99_function
之外我在此脚本中所有的东西,因此需要永远。
如何在此处获取相关功能的时间?在更哲学的层面上,为什么这在Python中如此挣扎?我已经定义了一个变量和一个函数;我想要做的就是用该变量调用函数的时间。不必编写超长代码行,或编写多行代码,或者必须导入东西或任何东西,这将是很好的。它就像Matlab中的tic
和toc
一样简单。我想相应的Python命令是在函数调用之前和之后使用'time.clock()',但我读过这可能是不准确和误导。
答案 0 :(得分:2)
您不需要在setup
内每次导入numpy,而是可以使用from __main__ import ...
从当前脚本导入所需的函数和变量,如下例所示。
import timeit
import numpy as np
def func1(x):
pass
def func2(x):
pass
def func3(x):
return np.array(x > 1000)
if __name__ == '__main__':
x = np.arange(10000)
time = timeit.timeit('func3(x)', setup='from __main__ import func3, x', number=1000)
print(time)
如果您从其他脚本导入代码,if __name__ == '__main__'
阻止将阻止if
语句中的代码运行,这意味着如果您导入的话,您不会意外地运行您的计时测试功能
此代码仅导入func3
和x
。我只对func3
(不是func1
和func2
)感兴趣,并且我已经定义了要测试的值(我称之为x
,但是&{ #39;相当于你的my_input
)。在这种情况下,您不需要导入numpy。
但我会完全并完全建议您考虑roippi's comment并使用IPython。 %timeit
魔术方法非常非常有用。
答案 1 :(得分:0)
作为未来的一个FYI:
我最近向issue2527提交了一个针对默认分支committed a few days ago的补丁。因此,只要3.5公开发布,您就可以这样做:
timeit.timeit('level_99_function(x)', globals=globals())
不像iPython的%timeit
那么棒,我知道,但远比你现在必须做的from __main__ import ...
废话要好得多。 More info in the docs