2024-04-26 07:19:42 发布
网友
如果有一个库,我将使用至少两种方法,在性能或内存使用方面,以下两种方法有什么不同吗?
from X import method1, method2
以及
import X
我不相信有什么真正的区别,一般来说,担心那么少的内存是不值得的。如果您要考虑内存问题,那么它很可能出现在您的代码中。
没有内存或速度差异(整个模块必须以任何方式计算,因为最后一行可能是Y = something_else)。除非你的电脑是20世纪80年代的,否则这一点都不重要。
Y = something_else
这是有区别的,因为在import x版本中有两个名称查找:一个用于模块名称,另一个用于函数名称;另一方面,使用from x import y时,只有一个查找。
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会更快,而如果使用多次,则使用from x import y会更快。
也就是说,像往常一样,我建议您不要遵循这些知识来决定如何导入模块和函数,因为这只是一些过早的优化。 就我个人而言,我认为在很多情况下,显式名称空间更具可读性,我建议您也这样做:使用您自己的美感:-)
我不相信有什么真正的区别,一般来说,担心那么少的内存是不值得的。如果您要考虑内存问题,那么它很可能出现在您的代码中。
没有内存或速度差异(整个模块必须以任何方式计算,因为最后一行可能是
Y = something_else
)。除非你的电脑是20世纪80年代的,否则这一点都不重要。这是有区别的,因为在
import x
版本中有两个名称查找:一个用于模块名称,另一个用于函数名称;另一方面,使用from x import y
时,只有一个查找。使用dis模块,您可以很好地看到这一点:
如您所见,使用表单
from x import y
要快一点。另一方面,
import x
比from x import y
便宜,因为名称查找更少;让我们看看反汇编的代码:我不知道原因,但表单
from x import y
看起来像一个函数调用,因此比预期的要贵;因此,如果只使用一次导入的函数,则意味着使用import x
会更快,而如果使用多次,则使用from x import y
会更快。也就是说,像往常一样,我建议您不要遵循这些知识来决定如何导入模块和函数,因为这只是一些过早的优化。
就我个人而言,我认为在很多情况下,显式名称空间更具可读性,我建议您也这样做:使用您自己的美感:-)
相关问题 更多 >
编程相关推荐