timeit
模块非常适合测量小代码片段的执行时间,但是当代码更改全局状态(如timeit
)时,很难获得准确的时序。
例如,如果我想花时间导入模块,那么第一次导入将比后续导入花费更长的时间,因为子模块和依赖项已经导入并且文件已经被缓存。所以使用更大的number
重复,如:
>>> import timeit
>>> timeit.timeit('import numpy', number=1)
0.2819331711316805
>>> # Start a new Python session:
>>> timeit.timeit('import numpy', number=1000)
0.3035142574359181
不起作用,因为一次执行的时间几乎与1000轮相同。我可以执行命令“重新加载”包:
>>> timeit.timeit('imp.reload(numpy)', 'import importlib as imp; import numpy', number=1000)
3.6543283935557156
但它只比第一个import
慢10倍似乎表明它也不准确。
似乎无法完全卸载模块("Unload a module in Python")。
所以问题是:准确衡量import
时间的恰当方法是什么?
答案 0 :(得分:2)
由于完全卸载模块几乎是不可能的,因此这个答案的灵感可能是this ......
你可以在python脚本中运行一个循环来运行x次python命令导入numpy
而另一个不执行任何操作,并减去+ average:
import subprocess,time
n=100
python_load_time = 0
numpy_load_time = 0
for i in range(n):
s = time.time()
subprocess.call(["python","-c","import numpy"])
numpy_load_time += time.time()-s
s = time.time()
subprocess.call(["python","-c","pass"])
python_load_time += time.time()-s
print("average numpy load time = {}".format((numpy_load_time-python_load_time)/n))