2016-11-05 53 views
4

從性能上看(時間或內存)是它更好地做到:最高效的方式做進口

import pandas as pd 

from pandas import DataFrame, TimeSeries 

是否依賴於有多少的最好的事情我從包中導入的課程?

同樣,我見過的人做這樣的事情:

def foo(bar): 
    from numpy import array 

爲什麼我會永遠想做一個函數或方法定義內的進口?這是否意味着每次調用該函數時都會執行導入?或者這只是爲了避免命名空間衝突?

+0

從功能導入背後的一個想法是避免導入(可能是未安裝的)模塊,如果該函數未被調用。 – chepner

回答

6

這是微型優化,你不應該擔心這一點。

模塊加載一次每個Python進程。所有導入的代碼只需要將一個名稱綁定到模塊中定義的模塊或對象上。該綁定是極其便宜

此外,您的模塊中的頂級代碼也只運行一次,所以綁定只發生一次。每次函數運行時,函數中的導入都會執行綁定,但這又很便宜,可以忽略不計。

導入一個函數有兩個原因:它不會把這個名稱放在模塊的全局命名空間中(所以沒有命名空間污染),並且因爲名稱現在是本地,使用該名稱是比使用全球性略快。

如果您想提高性能,請關注正在重複許多次的代碼。導入不是它。

+0

乾杯。我實際上並沒有打算使用它來改進任何真實的代碼。這只是一種學術好奇心。 – Batman

1

回答何時導入的更一般問題,導入是依賴關係。它是可能或不可能存在的代碼,這是程序運行所必需的。因此,儘快導入該代碼是一個非常好的主意,以防止在執行過程中出現愚蠢的錯誤。

尤其如此,當pypy變得更受歡迎,當導入可能存在但通過pypy不可用時。比代碼執行潛在的幾個小時更好地失敗。

至於「pandas導入pd」vs「來自熊貓導入DataFrame,TimeSeries」,這個問題有多個問題(如所有問題一樣),其中一些問題比其他更重要。存在命名空間的問題,可讀性問題,以及性能問題。正如Martjin所言,績效應該佔到決定的大約0.0001%。可讀性應該貢獻大約90%。命名空間只有10%,因爲它可以輕鬆地減輕。

個人而言,在我看來,import X as Yform X import Y都是不好的做法,因爲顯式優於隱式。您不希望在2000行上試圖記住哪個軟件包「calculate_mean」來自哪裏,因爲它在代碼中的其他地方沒有被引用。當我第一次開始使用numpy時,我是從互聯網複製/粘貼代碼,並不知道爲什麼我沒有/不能pip install np。這顯然不是一個問題,如果你有預先存在的知識,「np」是python的「numpy」,但對於它保存的3個字母來說,這是一個愚蠢和毫無意義的混淆。它來自numpy。使用numpy。

1

在尚未提及的函數內導入模塊有一個好處:這樣做可以讓您對模塊何時加載進行一些控制。事實上,儘管@ J.J的回答建議儘可能早地導入所有模塊,但這個控制允許你加載模塊推遲

你爲什麼要這麼做?嗯,雖然它並不能改善你的程序的實際表現,這樣做可以提高感知性能,並憑藉此,用戶體驗

在某種程度上,用戶感知您的應用程序是否基於啓動需要多長時間而快或慢。

MSDN: Best practices for your app's startup performance

你的主要腳本開始加載每個模塊可能需要一些時間。例如,我的一個應用程序使用Qt框架,Pandas,Numpy和Matplotlib。如果所有這些模塊都在應用程序的開頭正確導入,則用戶界面的外觀會延遲幾秒鐘。用戶不喜歡等待,他們很可能認爲你的應用程序通常很慢​​,因爲這種等待。

但是,如果例如Matplotlib僅從用戶發出繪圖命令時調用的那些函數中導入,則啓動時間會顯着減少。用戶認爲你的應用程序不再那麼遲鈍,這可能會帶來更好的用戶體驗。