4

在諸如Django的框架,我會想象,如果一個頁面上的用戶的土地(運行被稱爲「some_page」視圖功能),你必須在模塊的前8噸的進口不相關的這種看法,你這些進口產品正在浪費週期。我的問題是:Python - 通過不在模塊級別導入來優化?

  1. 是否有足夠的資源對高流量網站產生影響?
  2. 爲了達到這個目的,在函數中導入內部函數是不是很糟糕的做法,以至於在上述影響下應該避免這種做法?

注意:這可能被認爲是不成熟的優化,但我對這個說法不感興趣。爲了實際的理論,我們假設這是一個完整的網站,其中包含大量流量,需要儘可能進行優化,應用程序代碼以及數據庫已經由50位PhD數據庫管理員和開發人員進行了全面優化,而這些進口是唯一剩下的東西。

+0

沒有分析數據,這是過早的優化。請提出請求,在提出這樣的假設性問題之前查看數據。請分析數據,以便您可以看到這兩種設計的實際成本。請。得到。數據。 – 2010-11-02 19:29:27

+0

對於那些絆倒這個問題的人:http://wiki.python.org/moin/PythonSpeed/PerformanceTips#ImportStatementOverhead – orokusaki 2010-11-02 20:09:41

+0

請注意,假設:「用戶登陸頁面(運行稱爲」some_page「的視圖函數)而且你在模塊的頂部有8個與該視圖無關的導入,你就是在浪費這些導入的週期「是錯誤的。對於每個服務頁面,模塊都是從頭開始重新加載的。絆倒這個問題將導致不必要的混淆,因爲這個假設是錯誤的。 – 2010-11-02 21:09:53

回答

15

不,不要這樣做。在web上的正常python執行環境(mod_wsgi,gunicorn等)中,當您的進程啓動時,將執行這些導入,然後所有後續請求都不會重新執行腳本。如果將輸入放入函數中,則每次調用該函數時都必須處理這些輸入。

4

1)答案是否定的。 Django/Python不像PHP。您的整個模塊不會像每次使用PHP包含時一樣被重新解釋。該模塊將在內存中,每個頁面視圖將對您的視圖進行簡單的函數調用。

2)是的,這將是一個反優化,使在視圖級別進口。

5

是的,這是一個不好的做法,在函數級別導入。通過在模塊頂部使用更智能的導入,您可以創建一次,成本較低。但是,如果您在函數中放置導入,則每次運行該函數時都會承擔導入的成本。所以,不要在函數中導入,只需導入模塊的頂部。

有幾件事情可以做,以清理和改善你的進口:

  • 不要使用野生例如進口from x import *
  • 只要有可能,只需使用正常的導入方式即可。 import x
  • 嘗試了分割你的代碼轉換成更小的模塊可以單獨調用,從而使進口減少由

另外,將進口在模塊的頂部是一個風格問題。 PEP 8說,模塊需要在頂部導入,這是有原因的。這樣可讀性和可維護性要高得多。

最後,由於from x import *在功能級別上不是有效的Python 3.x,所以在功能級別的一些導入將會導致未來的兼容性問題。

+0

有趣的是,我沒有意識到Python 3k中的這種變化。謝謝。 – orokusaki 2010-11-02 20:06:19

1
  1. 編號與其他答案相同。

  2. 是的。與其他回答相同的原因。

順便說一句,你也可以懶洋洋地進口。 例如,Importing工具包可以將頂層代碼中的模塊「導入」,但只有在訪問其中一個屬性時纔會實際加載該模塊。

0

有時以下的鍋爐板是有道理的:

foo = None 

def foorify(): 
    global foo 
    if not foo: from xxx import foo 

    foo.bar() 

這是有道理的,當foorification是對的東西,很少改變,例如條件一臺服務器啓動而另一臺服務器永遠不啓動,或者如果您不希望或在應用程序啓動或大多數測試期間無法安全地導入foo。