2012-05-20 58 views
8

模塊在代碼中的加載位置是否重要? 或者他們都應該在頂部聲明,因爲在加載期間,外部模塊將不得不被加載,無論他們在代碼中聲明的位置......?Python:優化導入

實施例:

from os import popen 

try: 
    popen('echo hi') 
    doSomethingIllegal; 
except: 
    import logging     #Module called only when needed? 
    logging.exception("Record to logger) 

,或者這由編譯器優化的方式相同:

from os import popen 
import logging      #Module will always loaded regardless 

try: 
    popen('echo hi') 
    doSomethingIllegal; 
except: 
    logging.exception("Record to logger) 

回答

10

This指示它可能使一個區別:

「導入語句可以被執行幾乎在任何地方將它們放在功能中以限制其可見性和/或減少初始啓動時間通常很有用。雖然Python的解釋器進行了優化,多次不導入同一模塊,多次執行import語句會嚴重在某些情況下影響性能。」

這兩個操作系統的問題,local import statements?import always at top of module?詳細討論這一點。

最後,如果您想了解您的具體情況下,你可能會資料/基準的兩個備選方案在您的環境。

我更願意把我所有的導入語句在源文件的頂部,下面stylis抽象約定和一致性(也可能會使得更改變得更容易,以後不必通過源文件尋找遍佈各地的導入語句)

+0

還是有點困惑。不管加載器有沒有加載外部模塊,以防萬一被調用? 我能看到的唯一開銷只是一個額外的代碼行。 – tetris11

+1

只需在代碼中清楚,在文件頂部進行導入。 –

+0

@JakobBowyer但有什麼區別,性能明智是我真的要求 – tetris11

2

一般的經驗法則是導入應該位於文件的頂部,因爲這使得代碼更容易遵循,這使得更容易弄清楚模塊將需要什麼,而無需通過所有的代碼。

Python的風格指南涵蓋了進口應該是什麼樣子的一些基本原則:http://www.python.org/dev/peps/pep-0008/#imports

但在實踐中,有些時候是有意義的,從一個特定的函數中導入。這想出了進口,這將是圓形:

# Module 1 
from module2 import B 

class A(object): 
    def do_something(self): 
     my_b = B() 
     ... 

# Module 2 
from module1 import A 

class B(object): 
    def do_something(self): 
     my_a = A() 
     ... 

這不會因爲是工作,但你可以通過移動進口避開圓:

# Module 1 
from module2 import B 

class A(object): 
    def do_something(self): 
     my_b = B() 
     ... 

# Module 2 
class B(object): 
    def do_something(self): 
     from module1 import A 
     my_a = A() 
     ... 

理想情況下,你會設計類永遠不會出現,甚至可能將它們包含在同一個模塊中。在那個玩具的例子中,每個導入另一個導入都是沒有意義的。但是,實際上,在某些情況下,在方法本身中包含一個方法的導入更有意義,而不是將所有內容都拋入同一個模塊,或者將問題的方法提取到其他對象。

但是,除非您有充分的理由偏離,否則我會說這是符合頂級模塊的約定。