Python中导入的准确时间

时间:2017-05-15 21:40:58

标签: python import module timing

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时间的恰当方法是什么?

1 个答案:

答案 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))