挣扎于Python timeit

时间:2014-08-11 15:34:12

标签: python timeit

我正在努力使用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中的tictoc一样简单。我想相应的Python命令是在函数调用之前和之后使用'time.clock()',但我读过这可能是不准确和误导。

2 个答案:

答案 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语句中的代码运行,这意味着如果您导入的话,您不会意外地运行您的计时测试功能

此代码仅导入func3x。我只对func3(不是func1func2)感兴趣,并且我已经定义了要测试的值(我称之为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