使用"import <module>"或"from <module> import <func>"更有效吗?

Ash*_*shy 4 python import

假设我只需要使用re模块中的findall(),它是否更有效:

from re import findall
Run Code Online (Sandbox Code Playgroud)

要么

import re
Run Code Online (Sandbox Code Playgroud)

在速度/内存使用方面是否有任何差异?

Koz*_*huk 12

导入没有区别,但访问方面存在细微差别.

当您访问该功能时

re.findall() 
Run Code Online (Sandbox Code Playgroud)

python将需要首先在全局范围内找到该模块,然后在模块dict中找到findall.如果你在一个循环内调用它数千次,可能会有所作为.

  • +1,但是请注意Python将在全局命名空间之前搜索本地命名空间,因此创建引用该函数的本地函数(findall = re.findall)是最好的,并且与两种导入样式的工作方式相同. (3认同)

Noa*_*oah 11

如有疑问,请及时:

from timeit import Timer

print Timer("""re.findall(r"\d+", "fg12f 1414 21af 144")""", "import re").timeit()
print Timer("""findall(r"\d+", "fg12f 1414 21af 144")""", "from re import findall").timeit()
Run Code Online (Sandbox Code Playgroud)

我得到以下结果,使用至少5次重复的10,000,000次调用:

re.findall(): 123.444600105
findall(): 122.056155205
Run Code Online (Sandbox Code Playgroud)

findall()直接使用似乎有一个非常小的使用优势,而不是re.findall().

但是,实际的进口报表的速度差异很大.在我的计算机上,我得到以下结果:

>>> Timer("import re").timeit()
2.39156508446
>>> Timer("from re import findall").timeit()
4.41387701035
Run Code Online (Sandbox Code Playgroud)

所以import re看起来执行速度大约是原来的两倍.但据推测,导入代码的执行是您的瓶颈,而不是实际的导入.