讓我們看看字節碼是什麼樣子以下兩個功能:
def func1():
""" test imported each time function is run """
from task import test
test()
def func2():
""" test was imported at top of module """
test()
正如你可以看到下面,func2()
通過使用全球進口test
功能節省了大量的步驟。
>>> dis.dis(func1)
3 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 2 (('test',))
6 IMPORT_NAME 0 (task)
9 IMPORT_FROM 1 (test)
12 STORE_FAST 0 (test)
15 POP_TOP
4 16 LOAD_FAST 0 (test)
19 CALL_FUNCTION 0
22 POP_TOP
23 LOAD_CONST 3 (None)
26 RETURN_VALUE
>>> dis.dis(func2)
3 0 LOAD_GLOBAL 0 (test)
3 CALL_FUNCTION 0
6 POP_TOP
7 LOAD_CONST 1 (None)
10 RETURN_VALUE
正如delnan的評論所指出的,考慮到這一點可能是不成熟的優化。
至於test
位於全局命名空間中,這不太可能導致任何查找性能問題。我認爲你可以看到的最顯着的方式是,如果發生了test
的散列衝突,並且你經常使用另一個名稱,導致第二個名字的查找花費更長的時間。再次,不成熟的優化考慮這種罕見的情況。
至於名稱查詢性能:**沒關係**在極少數情況下,您會發現代碼完成後,發現它太慢並且異形。 – delnan 2012-01-27 17:53:13