gpt4 book ai didi

python - 比较 : import statement vs __import__ function

转载 作者:太空狗 更新时间:2023-10-29 17:58:28 24 4
gpt4 key购买 nike

作为问题的跟进 Using builtin __import__() in normal cases ,我领导了一些测试,并得出了令人惊讶的结果。

我在这里比较经典的 import 语句和调用 __import__ 内置函数的执行时间。为此,我在交互模式下使用以下脚本:

import timeit   

def test(module):
t1 = timeit.timeit("import {}".format(module))
t2 = timeit.timeit("{0} = __import__('{0}')".format(module))
print("import statement: ", t1)
print("__import__ function:", t2)
print("t(statement) {} t(function)".format("<" if t1 < t2 else ">"))

在链接的问题中,这是导入 sys 以及其他一些标准模块时的比较:

>>> test('sys')
import statement: 0.319865173171288
__import__ function: 0.38428380458522987
t(statement) < t(function)

>>> test('math')
import statement: 0.10262547545597034
__import__ function: 0.16307580163101054
t(statement) < t(function)

>>> test('os')
import statement: 0.10251490255312312
__import__ function: 0.16240755669640627
t(statement) < t(function)

>>> test('threading')
import statement: 0.11349136644972191
__import__ function: 0.1673617034957573
t(statement) < t(function)

到目前为止,import__import__() 更快。这对我来说很有意义,因为正如我在链接帖子中所写,我发现 IMPORT_NAME 指令与 CALL_FUNCTION 相比是合乎逻辑的,当后者导致调用 __import__

但是当涉及到不太标准的模块时,结果相反:

>>> test('numpy')
import statement: 0.18907936340054476
__import__ function: 0.15840019037769792
t(statement) > t(function)

>>> test('tkinter')
import statement: 0.3798560809537861
__import__ function: 0.15899962771786136
t(statement) > t(function)

>>> test("pygame")
import statement: 0.6624641952621317
__import__ function: 0.16268579177259568
t(statement) > t(function)

这种执行时间差异背后的原因是什么?import 语句在标准模块上更快的真正原因是什么?另一方面,为什么 __import__ 与其他模块一起运行更快?

测试以 Python 3.6 为主导

最佳答案

timeit 测量总执行时间,但是模块的第一次导入,无论是通过 import 还是 __import__,都比后续导入慢- 因为它是唯一一个实际执行模块初始化的。它必须在文件系统中搜索模块的文件,加载模块的源代码(最慢)或以前创建的字节码(慢但比解析 .py 文件快一点)或共享库(对于 C 扩展),执行初始化代码,并将模块对象存储在 sys.modules 中。随后的导入将跳过所有这些并从 sys.modules 中检索模块对象。

如果你颠倒顺序,结果会不同:

import timeit   

def test(module):
t2 = timeit.timeit("{0} = __import__('{0}')".format(module))
t1 = timeit.timeit("import {}".format(module))
print("import statement: ", t1)
print("__import__ function:", t2)
print("t(statement) {} t(function)".format("<" if t1 < t2 else ">"))

test('numpy')
import statement: 0.4611093703134608
__import__ function: 1.275512785926014
t(statement) < t(function)

获得无偏差结果的最佳方法是导入一次,然后进行计时:

import timeit   

def test(module):
exec("import {}".format(module))
t2 = timeit.timeit("{0} = __import__('{0}')".format(module))
t1 = timeit.timeit("import {}".format(module))
print("import statement: ", t1)
print("__import__ function:", t2)
print("t(statement) {} t(function)".format("<" if t1 < t2 else ">"))

test('numpy')
import statement: 0.4826306561727307
__import__ function: 0.9192819125911029
t(statement) < t(function)

所以,是的,import 总是比 __import__ 快。

关于python - 比较 : import statement vs __import__ function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46175875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com