Python中导入所花费的时间

use*_*646 11 python import

我想知道导入对内置模块和用户定义模块需要多长时间.

Szy*_* P. 8

从 Python3.7 版本开始,新-X importtime选项可用。要测量导入时间,只需使用该选项执行脚本,例如python -X importtime my_script.py.

以供参考:

  • 还有一个很好的工具可以可视化结果:“tuna”。取自这里:https://github.com/nschloe/tuna (4认同)

Dav*_*eau 6

分析导入的一种方法是使用bzr 源代码中使用的profile_imports模块:

# put those two lines at the top of your script
import profile_imports
profile_imports.install()

# display the results
profile_imports.log_stack_info(sys.stderr)
Run Code Online (Sandbox Code Playgroud)

除了为您提供进口时间外,这也估计了编制正则表达式的时间,这通常是进口放缓的重要原因.


bay*_*yer 5

你可以测试这个运行

$ time python -c "import math"
Run Code Online (Sandbox Code Playgroud)

但是,这会对你有什么帮助?进口只发生一次,几乎永远不会成为瓶颈.反复导入同一模块的速度不会比导入一次慢得多,因为Python会跟踪哪些模块已经导入.

你究竟想要实现什么目标?


dbr*_*dbr 5

要了解导入需要多长时间,最简单的方法可能是使用timeit 模块..

>>> import timeit
>>> t = timeit.Timer('import urllib')
>>> t.timeit(number = 1000000)
0.98621106147766113
Run Code Online (Sandbox Code Playgroud)

因此,要导入 urllib 100 万次,只需要不到一秒钟的时间(在 Macbook Pro 上)。

我有一个导入其他模块的主脚本。我需要计算它需要多少时间

如果您指的是总脚本执行时间,在 Linux/OS X/Cygwin 上,您可以使用以下time命令运行脚本,例如:

$ time python myscript.py 

real    0m0.046s
user    0m0.024s
sys     0m0.020s
Run Code Online (Sandbox Code Playgroud)

(请记住,这包括所有 Python 解释器启动时间,以及实际代码执行时间,尽管这是非常微不足道的数量)

另一种可能更有用的方法是分析脚本:

而不是运行你的代码

$ python myscript.py 
Run Code Online (Sandbox Code Playgroud)

..你用..

$ python -m cProfile myscript.py
         1059 function calls in 0.015 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.002    0.002    0.015    0.015 myscript.py:1(<module>)
   [...]
Run Code Online (Sandbox Code Playgroud)

我觉得命令行输出不是很容易阅读,所以我几乎总是使用gprof2dot,它将分析信息转换为一个漂亮的图形:

$ python -m cProfile -o myscript.prof myscript.py
$ python gprof2dot.py -o myscript.dot -f pstats myscript.prof
$ dot -Tpng -o profile.png prof_runtest.dot -Gbgcolor=black
Run Code Online (Sandbox Code Playgroud)

示例输出(1429x1896px PNG)

  • 嗯,我不认为这实际上导入了不止一次。它实际上只是测试 Python 的模块缓存的性能。`reload(module)` 也不具有与从头导入相同的行为。真正回答作者的问题其实挺难的,除非导入的时间足够大,一次测量一个调用是合理的。 (3认同)