Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在正常情况下使用内置导入_Python_Python Import - Fatal编程技术网

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