2011-10-04 50 views
7

我正在運行一個使用Django的網站,並且我在幾乎所有腳本的開頭導入了ipdb以使調試變得更容易。但是,大多數時候我從不使用模塊中的函數(僅當我正在調試時)。導入模塊(但不使用它)是否會降低Python的性能?

只是想知道,這會減少我的表現嗎?只是,當我想創建一個斷點,我喜歡寫:

ipdb.set_trace() 

,而不是:

import ipdb; ipdb.set_trace() 

但我已經看到了在幾個地方做了第二個例子,這讓我不知道如果它更有效...

我只是不知道如何導入python模塊與效率(假設你沒有在你的腳本中使用模塊方法)。

回答

4

正如@wRAR所提到的,加載模塊可能意味着執行任何數量的代碼,可能會花費任何時間量。另一方面,該模塊只會被加載一次,並且任何後續的導入嘗試都會找到os.sys.modules中的模塊並參考該模塊。

在Django的環境中調試運行模式,模塊從Django的AppCache刪除,實際上他們正在改變時,只能重新進口的,你可能不會有ipdb做的,所以在你的情況下,它不應該是一個問題。

但是,在這種情況下,這將是一個問題,有一些解決方法。假設您有使用反正加載自定義模塊,你可以添加一個功能,它是進口ipdb只有當你需要它:

# much used module: mymodule 
def set_trace(): 
    import ipdb 
    ipdb.set_trace() 
您要使用的模塊中

ipdb.set_trace

import mymodule 

mymodule.set_trace() 

,或者在你的模塊的頂部,使用跨模塊__debug__變量:

if __debug__: 
    from ipdp import set_trace 
else: 
    def set_trace(): return 
+0

導入模塊(但不使用它)會降低Python的性能嗎?這就是問題 – joaquin

+1

的確,@joaquin,當你寫下你的評論時,我已經在編輯上述過程了;)。有些人可能不同意,但這也是給那些對這個問題感興趣的人提供一些解決問題的建議的好地方。 – Remi

+0

謝謝!我讚賞這些實際例子。 =) –

2

簡短的回答:不是通常

龍答:

這將需要時間來加載模塊。如果從網絡驅動器或其他慢速源加載python,這可能會引起注意。但是,如果直接從硬盤驅動器運行,你永遠不會注意到。

正如@wRar指出的,導入模塊可以執行任意數量的代碼。您可以在模塊啓動時擁有您想要執行的任何代碼。但是,大多數模塊避免在啓動過程中執行不合理數量的代碼。這本身可能不是一個巨大的原因。

但是,導入非常大的模塊,尤其是那些導致導入大量c模塊的模塊也需要時間。

因此,導入需要時間,但每個導入的模塊只需要一次。如果您在模塊頂部導入模塊(而不是在函數中),則它僅適用於啓動時間。基本上,你不會避免導入模塊而獲得很多優化里程。

+0

@JBernardo:你說得對,我注意到了,'scipy'要慢得多,所以我通常只導入我實際使用的函數('from scipy import foo,bar,spam') – heltonbiker

+1

Loading一個模塊可能意味着執行可能花費任何時間量的任何數量的代碼。 – wRAR

+0

@wRAR,你是對的。 –

0

導入模塊,但不使用它decre ASES(系統)性能:

  1. 這需要時間來導入模塊
  2. 導入模塊佔用內存

雖然第一點讓你的程序慢啓動,第二點可能使您的所有程序都會變慢,具體取決於您系統上的內存總量。

相關問題