python: 重新导入模块的成本是多少?
python: What is the cost of re-importing modules?
我经常想在需要它们的狭窄上下文中导入模块。例如在使用模块的函数体中。在这种情况下,import 语句可能会被执行多次。
除了风格问题,这样做的性能成本是多少?
重复 import
语句的成本非常低,因为 Python 缓存模块并且只导入一次(在第一个 import
时),除非明确要求重新加载模块使用 reload
函数。重复 import
语句的效果(和粗略的性能影响)基本上只是在本地命名空间中绑定导入的名称。
然而,它并不是完全免费的; import
确实必须锁定和解锁导入 table 锁,并解析提供的名称。这意味着如果频繁调用它仍然会减慢您的程序。
看看本站的解释:
https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Import_Statement_Overhead
即使 Python 不会多次导入同一个模块,您的性能仍然可能受到影响,具体取决于代码的结构。您或许可以使用计时器来查看实际影响。
将此作为答案发布,因为它太大而无法发表评论:
我不清楚我最初的计时工作是否按预期工作,因为我收到警告说最慢的速度比最快的速度慢 20 倍 - 即:一些缓存正在发生以改变结果。
以下 运行 在装有 python 2.7.3 的 ipython 笔记本中,然而,似乎表明性能下降了大约 450 纳秒:
%%timeit import numpy
pass
100000000 次循环,3 次最佳:每次循环 11.3 ns
%%timeit import numpy
import numpy
pass
1000000 次循环,3 次最佳:每次循环 465 纳秒
我经常想在需要它们的狭窄上下文中导入模块。例如在使用模块的函数体中。在这种情况下,import 语句可能会被执行多次。
除了风格问题,这样做的性能成本是多少?
重复 import
语句的成本非常低,因为 Python 缓存模块并且只导入一次(在第一个 import
时),除非明确要求重新加载模块使用 reload
函数。重复 import
语句的效果(和粗略的性能影响)基本上只是在本地命名空间中绑定导入的名称。
然而,它并不是完全免费的; import
确实必须锁定和解锁导入 table 锁,并解析提供的名称。这意味着如果频繁调用它仍然会减慢您的程序。
看看本站的解释:
https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Import_Statement_Overhead
即使 Python 不会多次导入同一个模块,您的性能仍然可能受到影响,具体取决于代码的结构。您或许可以使用计时器来查看实际影响。
将此作为答案发布,因为它太大而无法发表评论:
我不清楚我最初的计时工作是否按预期工作,因为我收到警告说最慢的速度比最快的速度慢 20 倍 - 即:一些缓存正在发生以改变结果。
以下 运行 在装有 python 2.7.3 的 ipython 笔记本中,然而,似乎表明性能下降了大约 450 纳秒:
%%timeit import numpy
pass
100000000 次循环,3 次最佳:每次循环 11.3 ns
%%timeit import numpy
import numpy
pass
1000000 次循环,3 次最佳:每次循环 465 纳秒