2008-11-17 12 views
4

如果這個問題似乎是補救,我很抱歉。Python中哪個更高效:標準導入還是上下文導入?

這將在Python被認爲是更有效的:

標準進口

import logging 

try: 
    ...some code... 
exception Exception, e: 
    logging.error(e) 

......或者......

語境進口

try: 
    ...some code... 
exception Exception, e: 
    import logging 
    logging.error(e) 
+1

我不確定你的進口效率是否真的應該花費你的表現時間。如果你有一個單獨的模塊確實會減​​慢你的開始時間,那麼考慮重構它,以便在需要時進行計算,而不是在加載時進行。 – 2008-11-17 23:27:48

+0

我從來沒有說過這是造成減速。我只是對這個話題的共識感到好奇。 – Huuuze 2008-11-18 15:38:31

回答

6

上下文導入在技術上更有效率,但我認爲它們可能會產生其他問題。

以後,如果你想添加除了條款類似的,你現在有兩個地方要保持相同的代碼塊。您現在還有測試異常的問題,以確保第一次導入不會導致代碼中出現無法預料的問題。

+2

如果它們很少或從不使用,它們只會更有效率。 – 2008-11-17 19:25:50

2

他們基本上是一樣的。無論您導入多少次,Python解釋器只會加載一個使用過的模塊一次。更改導入語句的位置只會影響名稱的綁定位置 - 例如,如果您的語句位於函數中,則只能在該函數中使用該名稱。

一般,不過,進口通常是做盡可能靠近文件儘可能的「頂部」。

+0

儘管在給出的例子中,上下文導入的區別在於,如果發生異常,模塊只能被加載。 – 2008-11-18 07:42:47

3

這取決於您執行上下文導入的頻率。

import語句需要檢查,看看是否存在模塊,其中有一個非零成本。

大量的上下文導入將是性能損失,因爲簡單性沒有真正的收益。沒有什麼好處,除非你確定導入很少或從不使用。

if語句上下文進口意義,特別是當它在頂層,這意味着一次精確的完成。

if someConfig: 
    import this as bigDeal 
else: 
    import that as bigDeal 
3

這是一個微觀優化。不要擔心。

1

在實踐中,這兩種方法之間的性能差異將非常小。我從來沒有見過這種情況發生了明顯的變化。

這是值得記住的是,Python解釋器將永遠只能做一次解析模塊時,它是第一個引進的工作。

一般來說,你將最終獲得更易於維護的代碼的,你只要輸入你需要在文件頂部的所有模塊。