如果有一个库我将使用至少两种方法,那么以下之间在性能或内存使用方面是否有任何差异?
from X import method1, method2
和
import X
最佳答案
有区别,因为在 import x
版本中有两个名称查找:一个是模块名,一个是函数名;另一方面,使用 from x import y
,您只有一次查找。
你可以很好地看到这一点,使用 dis 模块:
import random
def f_1():
random.seed()
dis.dis(f_1)
0 LOAD_GLOBAL 0 (random)
3 LOAD_ATTR 0 (seed)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
from random import seed
def f_2():
seed()
dis.dis(f_2)
0 LOAD_GLOBAL 0 (seed)
3 CALL_FUNCTION 0
6 POP_TOP
7 LOAD_CONST 0 (None)
10 RETURN_VALUE
如您所见,使用 from x import y
形式要快一些。
另一方面,import x
比 from x import y
更便宜,因为名称查找更少;我们来看看反汇编的代码:
def f_3():
import random
dis.dis(f_3)
0 LOAD_CONST 1 (-1)
3 LOAD_CONST 0 (None)
6 IMPORT_NAME 0 (random)
9 STORE_FAST 0 (random)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
def f_4():
from random import seed
dis.dis(f_4)
0 LOAD_CONST 1 (-1)
3 LOAD_CONST 2 (('seed',))
6 IMPORT_NAME 0 (random)
9 IMPORT_FROM 1 (seed)
12 STORE_FAST 0 (seed)
15 POP_TOP
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
我不知道原因,但是看起来 from x import y
的形式看起来像一个函数调用,因此比预期的更昂贵;因此,如果导入的函数只使用一次,则意味着使用 import x
会更快,而如果多次使用,则使用 会更快从 x 导入 y
.
也就是说,像往常一样,我建议您不要根据这些知识来决定如何导入模块和函数,因为这只是一些过早的优化。
就个人而言,我认为在很多情况下,显式命名空间更具可读性,我建议你也这样做:使用你自己的审美 :-)
关于Python 导入 X 还是从 X 导入 Y? (表现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3591962/