2014-02-23 31 views

回答

0

它本質上是相同的。在這兩種情況下,無論您使用哪個部件,都需要加載整個myfile模塊。這兩個版本都不會創建不必要的副本,因此如果myfile.title是巨大的,那麼這兩個版本都不會將您的內存填滿myfile.title的副本。

+0

因此,這兩種情況下複製整個模塊到導入的文件? – pk10

+0

@ user2961121:兩種情況都不能複製。無論有多少模塊在單個程序中導入'myfile',只有一個'myfile'模塊將被加載以供所有模塊共享。 – user2357112

+0

好吧,那麼用屬性名稱來限定模塊名稱以獲取它(情況1)並直接取回它(情況2)會有什麼性能影響? 對不起,如果問題很蠢,我是一個新手:( – pk10

0

導入模塊不會浪費任何東西;模塊始終完全導入(映射到myfile.modules),所以無論您使用的是import myfile還是from myfile import title都沒有任何優勢。

兩個語句之間的唯一區別是什麼名字爲界; import myfile結合名稱myfile到模塊(因此myfile -> myfile.modules['myfile']),而從myfile import title結合不同的名字,標題,在包含在該模塊(因此title -> myfile.modules['myfile'].title)內的屬性直指向。 myfile模塊的其餘部分仍然存在,無論您是否使用其他模塊。

還有兩種方法之間沒有性能差異。是的,myfile.title必須查找兩件事;它必須在您的全局名稱空間(查找模塊)中查找myfile,然後查找屬性標題。是的,通過使用from myfile import title,您可以跳過屬性查找,因爲您已經直接引用了該屬性。但是導入語句仍然需要這樣做,導入時它會查找相同的屬性,並且您只需要使用標題一次。如果你不得不在循環中使用標題數千次,它可能會有所作爲,但在這種特定情況下,它確實不會。

一種或另一種則之間的選擇,應根據編碼風格代替。

在一個大的模塊,我肯定要用import myfile;代碼文檔很重要,並且在大型模塊中的某個地方使用myfile.title可以使您所指的內容更加清晰,而不僅僅是標題。

如果使用標題的唯一地方是在「主要」塊調用main()功能,通過各種手段使用from myfile import title如果你感覺如何快樂:

if __name__ == '__main__': 
    from myfile import title 
    main(title) 

我仍然會使用import myfile我自己。所有的東西都是平等的(而且它們的性能和用來寫它的字符數量),這對我來說更容易。

如果你完全導入別的東西的話,或許性能發揮了作用。但是,只有在模塊中多次使用特定名稱,例如在關鍵循環中。但是,然後創建一個本地名稱(功能內)將更快:

import myfile 

def title(): 
    localname = somemodule.somefunctionorother 
    while test: 
     # huge, critical loop 
     foo = localname(bar) 
+0

謝謝你這麼精心的闡述和解釋! – pk10

+0

@ user2961121 - 不客氣,希望它有幫助! – Drewness

+0

你能不能請看看這個:http://stackoverflow.com/questions/21965009/does-reloading-a-module-changes-the-name-in-the-the-module-previously-imported-relo 謝謝! – pk10