当您
timeit从命令行这样调用时:
python -mtimeit -s'import test' 'test.foo()'
该
timeit模块称为脚本。特别地,该
main函数称为:
if __name__ == "__main__": sys.exit(main())
如果看一下源代码,您会发现该
main函数可以带有一个
args参数:
def main(args=None): if args is None: args = sys.argv[1:]
因此,确实可以
timeit从程序内部运行,并且行为与从CLI运行时完全相同。只需提供您自己的,
args而不是将其设置为
sys.argv[1:]:
import timeitimport shlexdef foo(): total = 0 for i in range(10000): total += i**3 return totaltimeit.main(args=shlex.split("""-s'from __main__ import foo' 'foo()'"""))
将打印类似
100 loops, best of 3: 7.9 msec per loop
不幸的是,
main打印到控制台,而不是返回每个循环的时间。所以,如果你想以编程方式使用的结果,也许是最简单的方法是通过复制来启动该
main功能,然后修改它-
改变打印代码,改为返回
usec。
OP的示例: 如果将其放置在中
utils_timeit.py:
import timeitdef timeit_auto(stmt="pass", setup="pass", repeat=3): """ http://stackoverflow.com/q/19062202/190597 (endolith) Imitate default behavior when timeit is run as a script. Runs enough loops so that total execution time is greater than 0.2 sec, and then repeats that 3 times and keeps the lowest value. Returns the number of loops and the time for each loop in microseconds """ t = timeit.Timer(stmt, setup) # determine number so that 0.2 <= total time < 2.0 for i in range(1, 10): number = 10**i x = t.timeit(number) # seconds if x >= 0.2: break r = t.repeat(repeat, number) best = min(r) usec = best * 1e6 / number return number, usec
您可以在如下脚本中使用它:
import timeitimport utils_timeit as UTdef foo(): total = 0 for i in range(10000): total += i**3 return totalnum, timing = UT.timeit_auto(setup='from __main__ import foo', stmt='foo()')print(num, timing)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)