gpt4 book ai didi

python - 正常情况下使用内置 __import__()

转载 作者:行者123 更新时间:2023-11-30 22:30:04 25 4
gpt4 key购买 nike

这是我检查__import__()性能的地方

In [9]: %%timeit
...: math = __import__('math')
...: sqrt = math.sqrt
...: sqrt(7894561230)
...:
The slowest run took 11.16 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 534 ns per loop

In [10]: %%timeit
...: from math import sqrt
...: sqrt(7894561230)
...:
...:
The slowest run took 10.23 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 979 ns per loop

内置__import__模块似乎比传统的导入方式更快,

那么它可以像我使用过的那样在代码中使用吗?或者这样做有什么重大危害吗?__import__文档没有说明这样做有任何危害。

但它指出

Direct use of __import__() is rare, except in cases where you want to import a module whose name is only known at runtime.

所以我的问题是它也可以在正常情况下使用吗?或者说它有什么缺点吗?

最佳答案

这是一个小“基准”。让我们定义两个函数:

def f1():
import sys

def f2():
sys = __import__('sys')

字节码比较:

>>> dis.dis(f1)
5 0 LOAD_CONST 1 (0)
2 LOAD_CONST 0 (None)
4 IMPORT_NAME 0 (sys)
6 STORE_FAST 0 (sys)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE

>>> dis.dis(f2)
8 0 LOAD_GLOBAL 0 (__import__)
2 LOAD_CONST 1 ('sys')
4 CALL_FUNCTION 1
6 STORE_FAST 0 (sys)
8 LOAD_CONST 0 (None)
10 RETURN_VALUE

生成的字节码具有相同数量的指令,但它们不同。那么时间安排又如何呢?

>>> timeit.timeit(f1)
0.4096750088112782

>>> timeit.timeit(f2)
0.474958091968411

事实证明,__import__方式速度较慢。此外,它的可读性远不如经典的 import 语句。

结论:坚持导入

<小时/>

现在进行一些解释...

我认为调用 __import__ 比执行 import 语句慢,因为后者生成的字节码经过优化。

看一下指令:__import__ 的字节码看起来就像任何其他函数调用一样,带有 CALL_FUNCTION 指令。另一方面,import 语句会生成 IMPORT_NAME 指令,该指令看起来像是专用于导入的指令,并且可能由解释器以优化的方式执行。

事实上,第三条指令是两个字节码之间唯一真正的区别。所以这两个函数的区别就在于IMPORT_NAMECALL_FUNCTION的区别。

关于python - 正常情况下使用内置 __import__(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46173417/

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