如果一個大模塊被代碼的某個子模塊加載,那麼從該名稱空間引用模塊而不是再次導入它有什麼好處?python會在多次導入模塊時優化模塊嗎?
例如: 我有一個模塊MyLib,它廣泛使用了ReallyBigLib。如果我有進口MyLib中的代碼,我應該挖掘模塊從像這樣
import MyLib
ReallyBigLib = MyLib.SomeModule.ReallyBigLib
或只是
import MyLib
import ReallyBigLib
如果一個大模塊被代碼的某個子模塊加載,那麼從該名稱空間引用模塊而不是再次導入它有什麼好處?python會在多次導入模塊時優化模塊嗎?
例如: 我有一個模塊MyLib,它廣泛使用了ReallyBigLib。如果我有進口MyLib中的代碼,我應該挖掘模塊從像這樣
import MyLib
ReallyBigLib = MyLib.SomeModule.ReallyBigLib
或只是
import MyLib
import ReallyBigLib
Python模塊可被視爲單身......無論多少次,你將它們導入他們得到初始化只有一次,所以最好做到:
import MyLib
import ReallyBigLib
相關文檔的import語句:
https://docs.python.org/2/reference/simple_stmts.html#the-import-statement
一旦模塊的名稱是已知的(除非另有規定,術語「模塊」指的兩個包和模塊),搜索噸他可以開始模塊或包裝。檢查的第一個地方是sys.modules,這是先前導入的所有模塊的緩存。如果找到該模塊,則在步驟(2)中使用該模塊。
導入模塊被緩存在sys.modules:
這是模塊的名稱映射到一個已加載模塊的字典。這可以被操縱來強制重新加載模塊和其他技巧。請注意,從該字典中刪除模塊與在相應的模塊對象上調用reload()不同。
這是相同的performancewise。 Python中沒有JIT編譯器。
現在我們有[PyPy](http://pypy.org/),其中包括基於llvm的JIT。 – BobC 2014-04-10 18:16:09
它沒有實質區別。如果大模塊已經被加載,則第二個示例中的第二個導入除了將「ReallyBigLib」添加到當前名稱空間之外什麼都不做。
正如其他人指出的那樣,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的美麗之處在於,每個東西都是如何執行命名空間中的腳本的。
導入模塊的內部註冊表是sys.modules
字典,它將模塊名稱映射到模塊對象。您可以在那裏查看當前導入的所有模塊。
您也可以通過與sys.modules
進行聯繫來獲取一些有用的技巧(例如,如果需要) - 例如將您自己的對象添加爲可由其他模塊導入的僞模塊。
警告:Python不保證該模塊不會被初始化兩次。 我遇到了這樣的問題。討論: http://code.djangoproject.com/ticket/8193
謝謝, 我可以發誓我讀了這個地方,但我找不到它確認 – JimB 2008-11-17 16:41:13
但是,如果你想重新導入模塊,那麼你可以使用reload()函數。例如,這可能是模塊發生了變化。 – 2008-11-17 22:43:24