Accurate timing for imports in Python

我是研究僧i 提交于 2020-01-02 07:48:06

问题


The timeit module is great for measuring the execution time of small code snippets but when the code changes global state (like timeit) it's really hard to get accurate timings.

For example if I want to time it takes to import a module then the first import will take much longer than subsequent imports, because the submodules and dependencies are already imported and the files are already cached. So using a bigger number of repeats, like in:

>>> import timeit
>>> timeit.timeit('import numpy', number=1)
0.2819331711316805

>>> # Start a new Python session:
>>> timeit.timeit('import numpy', number=1000)
0.3035142574359181

doesn't really work, because the time for one execution is almost the same as for 1000 rounds. I could execute the command to "reload" the package:

>>> timeit.timeit('imp.reload(numpy)', 'import importlib as imp; import numpy', number=1000)
3.6543283935557156

But that it's only 10 times slower than the first import seems to suggest it's not accurate either.

It also seems impossible to unload a module entirely ("Unload a module in Python").

So the question is: What would be an appropriate way to accuratly measure the import time?


回答1:


Since it's nearly impossible to fully unload a module, maybe the inspiration behind this answer is this...

You could run a loop in a python script to run x times a python command importing numpy and another one doing nothing, and substract both + 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))


来源:https://stackoverflow.com/questions/43989235/accurate-timing-for-imports-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!