Python导入X还是从X导入Y?(性能)

2024-04-26 07:19:42 发布

您现在位置:Python中文网/ 问答频道 /正文

如果有一个库,我将使用至少两种方法,在性能或内存使用方面,以下两种方法有什么不同吗?

from X import method1, method2

以及

import X

Tags: 方法内存fromimport性能method1method2
3条回答

我不相信有什么真正的区别,一般来说,担心那么少的内存是不值得的。如果您要考虑内存问题,那么它很可能出现在您的代码中。

没有内存或速度差异(整个模块必须以任何方式计算,因为最后一行可能是Y = something_else)。除非你的电脑是20世纪80年代的,否则这一点都不重要。

这是有区别的,因为在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会更快,而如果使用多次,则使用from x import y会更快。

也就是说,像往常一样,我建议您不要遵循这些知识来决定如何导入模块和函数,因为这只是一些过早的优化。
就我个人而言,我认为在很多情况下,显式名称空间更具可读性,我建议您也这样做:使用您自己的美感:-)

相关问题 更多 >