Python 在正常情况下使用内置导入
在这里,我检查了Python 在正常情况下使用内置导入,python,python-import,Python,Python Import,在这里,我检查了\uuuuu import\uuuuu() 内置的导入模块似乎比传统的导入方式更快 因此,它是否可以像我使用过的那样在代码中使用,或者这样做是否有任何重大危害,\uuuuu import\uuuudoc没有说明这样做有任何危害 但它指出 直接使用\uuuu import\uuuu()的情况很少,除非您希望 导入仅在运行时才知道其名称的模块 所以我的问题是,它是否也能用于正常情况。或者它有什么缺点吗?这里有一个小的“基准”。让我们定义两个函数: def f1(): impo
\uuuuu import\uuuuu()
内置的导入模块似乎比传统的导入方式更快
因此,它是否可以像我使用过的那样在代码中使用,或者这样做是否有任何重大危害,\uuuuu import\uuuu
doc没有说明这样做有任何危害
但它指出
直接使用\uuuu import\uuuu()
的情况很少,除非您希望
导入仅在运行时才知道其名称的模块
所以我的问题是,它是否也能用于正常情况。或者它有什么缺点吗?这里有一个小的“基准”。让我们定义两个函数:
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
事实证明,\uuuuuu导入
方式较慢。
此外,它的可读性远远低于经典的import
语句
结论:坚持import
现在来解释一下 我假设调用
\uuuu import\uuuu
比执行import
语句要慢,因为后者生成的字节码得到了优化
请看一下说明:\uuuuu import\uuuuu
的字节码与任何其他函数调用一样,具有调用函数
说明。
另一方面,import
语句会产生一条import\u NAME
指令,该指令看起来像是专门用于导入的指令,并且可能由解释器以优化的方式执行
事实上,第三条指令是两个字节码之间唯一的真正区别。
因此,这两个函数之间的区别在于
IMPORT\u NAME
和CALL\u FUNCTION
之间的区别,在第一次IMPORT
之后,它只会在sys.modules
中查找模块,而不会再次真正加载包。因此,从计时中,您无法确定哪一条加载速度更快,只是哪一条语句在sys.modules
中查找速度更快。这就是我的意图吗?我在两个不同的终端上检查了这一点,首先我使用了\uuuuuu import\uuuuuuu
,第二次我使用了传统的方式,即使是这样,我也得到了前者的快速。是的,但是timeit重复了这个语句,所以实际上第一次调用是加载模块的调用。1000000个循环中的每一个循环实际上都不会“加载”模块。@MSeifert Ok得到了它,但是to没有\uuuu import\uuu()
更快,或者我遗漏了什么。后续问题:得到了!,但是当我在做%%timeit
的时候,是什么导致了延迟?我做了你演示的,但是我使用了数学
模块,func1
用传统的方式给出了0.630451876068115
和func2
用导入
给出了0.456161021862793
。我也试过使用numpy
,\uuuuu import\uuuu()
花费的时间更少。但我肯定同意你最后的回答。
>>> timeit.timeit(f1)
0.4096750088112782
>>> timeit.timeit(f2)
0.474958091968411