Python 导入 X 还是从 X 导入 Y? (表现)

标签 python performance

如果有一个库我将使用至少两种方法,那么以下之间在性能或内存使用方面是否有任何差异?

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 xfrom 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/

相关文章:

javascript - 提高 React 用户界面性能的良好实践?

python - 未处理的异常 : Connection closed while receiving data

python - 更快的numpy笛卡尔到球坐标转换?

python - 排序 python 3.7+ 字典的最快方法

使用模板化函数的 C++ STD::Vector 运行时间异常长

c# - 从字典中获取任何元素的最快方法

javascript - d3.min.js Uncaught TypeError : a. 映射不是函数

python - 在 Pygame 中拉伸(stretch)图像,同时保留角点

python - 在 Inkscape 中显示/隐藏扩展界面的元素

python - 根据条件有效反转列表中的 float