2008-11-17 64 views
34

如果一個大模塊被代碼的某個子模塊加載,那麼從該名稱空間引用模塊而不是再次導入它有什麼好處?python會在多次導入模塊時優化模塊嗎?

例如: 我有一個模塊MyLib,它廣泛使用了ReallyBigLib。如果我有進口MyLib中的代碼,我應該挖掘模塊從像這樣

import MyLib 
ReallyBigLib = MyLib.SomeModule.ReallyBigLib 

或只是

import MyLib 
import ReallyBigLib 

回答

46

Python模塊可被視爲單身......無論多少次,你將它們導入他們得到初始化只有一次,所以最好做到:

import MyLib 
import ReallyBigLib 

相關文檔的import語句:

https://docs.python.org/2/reference/simple_stmts.html#the-import-statement

一旦模塊的名稱是已知的(除非另有規定,術語「模塊」指的兩個包和模塊),搜索噸他可以開始模塊或包裝。檢查的第一個地方是sys.modules,這是先前導入的所有模塊的緩存。如果找到該模塊,則在步驟(2)中使用該模塊。

導入模塊被緩存在sys.modules

這是模塊的名稱映射到一個已加載模塊的字典。這可以被操縱來強制重新加載模塊和其他技巧。請注意,從該字典中刪除模塊與在相應的模塊對象上調用reload()不同。

+0

謝謝, 我可以發誓我讀了這個地方,但我找不到它確認 – JimB 2008-11-17 16:41:13

+2

但是,如果你想重新導入模塊,那麼你可以使用reload()函數。例如,這可能是模塊發生了變化。 – 2008-11-17 22:43:24

0

這是相同的performancewise。 Python中沒有JIT編譯器。

+0

現在我們有[PyPy](http://pypy.org/),其中包括基於llvm的JIT。 – BobC 2014-04-10 18:16:09

7

它沒有實質區別。如果大模塊已經被加載,則第二個示例中的第二個導入除了將「ReallyBigLib」添加到當前名稱空間之外什麼都不做。

20

正如其他人指出的那樣,Python維護一個已導入的所有模塊的內部列表。當您第一次導入模塊時,模塊(腳本)將在其自己的名稱空間中執行,直到結束,內部列表被更新,並且在導入語句後繼續執行。

試試這個代碼:

# module/file a.py 
    print "Hello from a.py!" 
    import b 

    # module/file b.py 
    print "Hello from b.py!" 
    import a 

沒有循環:只有一個緩存查找。

>>> import b 
Hello from b.py! 
Hello from a.py! 
>>> import a 
>>> 

Python的美麗之處在於,每個東西都是如何執行命名空間中的腳本的。

3

導入模塊的內部註冊表是sys.modules字典,它將模塊名稱映射到模塊對象。您可以在那裏查看當前導入的所有模塊。

您也可以通過與sys.modules進行聯繫來獲取一些有用的技巧(例如,如果需要) - 例如將您自己的對象添加爲可由其他模塊導入的僞模塊。