2014-12-02 53 views
1

我會寫(業餘)代碼,這是比我以前使用的更多的CPU和內存密集型。我在其他的代碼注意到,一些有利於是否有「從......導入...」的性能優勢?

import something 
(...) 
a = something.method() 

from something import method 
(...) 
a = method() 

是否有性能優勢,使用一種風格與其他?

PEP-0008 discusses imports但在閱讀完本文後,它看起來對於我未經訓練的眼睛而言,上述兩種情況更多的是品味/風格。我更喜歡鍵入a = something.method(),因爲我會更好地理解我的代碼。這就是說,如果這真的會影響性能,我會切換。

注意:這個問題不是關於個人喜好,而是兩種進口款式的實際表現(或缺乏)。這個方面很好地討論in another question

+1

第一種方式是首選方式,因爲它更明確。第二種方法是如果你懶得在代碼中輸入'something.'。 – khelwood 2014-12-02 12:00:09

回答

3

在性能上的唯一區別是,一個包括一個額外的屬性查詢:

a = something.method() 

,而其他引用method直接

a = method() 

這是由from ... import ...聲明進行反駁在綁定名稱時查找。這些行動之間的差異是可忽略不計

導入實際上只是綁定名稱到已經加載的對象。如果Python尚未可用,Python會首次加載整個模塊,但如何綁定名稱對加載的內容沒有影響。

因此,這是一種風格選擇。人們喜歡一眼就能確定一個物體來自哪裏。從模塊導入模塊而不是對象會爲您提供此視覺參考。

+1

使用'timeit',我得到了'import os'的〜0.7us,'from os import path'和'from os import open'都得到了〜2us;使用'import os; os.open'給我〜0.8us,'從os導入打開;打開'給我〜2us ...我不確定*爲什麼這是,並且差異當然是CPU性能可以忽略不計;但是如果你使用大型模塊並且導入較少(也就是說,大多數應用程序通常不需要導入所有的「PyQT」),那麼可能存在內存優勢? – Carpetsmoker 2014-12-02 12:05:37

+0

@Carpetsmoker我認爲在一種情況下,在全局命名空間中進行查找,然後下降到'os'中,在另一種情況下,您直接下載到'os'中。 – wenzul 2014-12-02 12:13:52

+0

@Carpetsmoker:你是如何運行這些'timeit'測試的?考慮到'timeit'名稱被創建爲* locals *,因此再次查找名稱與使用全局名稱有不同的性能影響。 'from ... import ...'比'import'做更多的工作,因爲它必須查找要綁定的名稱(除了首先查找模塊對象),所以您希望它會花費更長的時間。顯然,查找比從os.open中查找屬性稍慢。 – 2014-12-02 12:20:30

相關問題