2008-12-06 19 views
3

說,我只需要使用的findAll()從重新模塊,是它更有效地做到:使用「進口<module>」或「從<module>進口<func>」更高效嗎?

from re import findall 

import re 

是否有實際速度/內存使用情況等有什麼區別?

+0

不成熟的優化是邪惡的。請提供一些具體的東西來優化。毛毯「更有效」如果沒有特定的代碼來衡量,問題就毫無意義。 – 2008-12-07 14:15:53

回答

10

導入沒有什麼區別,但是在訪問方面有一些細微差別。

當您訪問功能

re.findall() 

蟒蛇將需要首先找到在全球範圍內的模塊,然後找到的findall模塊字典。如果你在一個循環內調用它幾千次,可能會有所作爲。

+3

+1,但也要注意,Python將在全局名稱空間之前搜索本地名稱空間,因此創建引用該函數的本地函數(findall = re.findall)是最好的,並且與兩種導入樣式的工作方式相同。 – Tom 2008-12-06 21:20:55

3

除了導入後在本地名稱空間中可見的re的名稱,沒有區別。

8

有疑問時,時間是:

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() 

我得到下面的結果,使用最小的5次重複的10,000,000電話:

re.findall(): 123.444600105 
findall(): 122.056155205 

似乎有一個非常輕微的使用優勢直接使用findall(),而不是re.findall()

但是,實際進口報表的速度差異很大。在我的電腦,我得到如下結果:

>>> Timer("import re").timeit() 
2.39156508446 
>>> Timer("from re import findall").timeit() 
4.41387701035 

所以import re似乎是大約兩倍的速度執行。不過,據推測,執行導入的代碼是你的瓶頸,而不是實際的導入。

+0

你什麼時候打算導入100萬次? – hop 2008-12-07 03:51:45

相關問題