2012-06-22 21 views
4

我已經創建了許多個人庫來幫助我進行日常編碼。最好的做法是在Python程序的開始部分放置導入。但是說我導入我的庫,或者甚至只是從庫中的一個函數或類。所有模塊都被導入(即使這些模塊用於其他未使用的類或函數中)。我認爲這會增加程序的開銷?控制python導入以減小大小和開銷

一個例子。我有一個名爲pytools的庫,它看起來像這樣

import difflib 

def foo(): 
    # uses difflib.SequenceMatcher 

def bar(): 
    # benign function ie 
    print "Hello!" 
    return True 

class foobar: 
    def __init__(): 
     print "New foobar" 
    def ret_true(): 
     return True 

foo函數使用difflib。現在說我正在寫一個需要使用bar和foobar的新程序。我既可以寫

import pytools 
... 
item = pytools.foobar() 
vals = pytools.bar() 

或者我可以做

from pytools import foobar, bar 
... 
item = foobar() 
vals = bar() 

無論是否選擇開銷減少或排除foo和其對difflib依賴進口?如果difflib的導入位於foo函數內部會怎麼樣?

我遇到的問題是將簡單的程序轉換爲只能使用一個或兩個類或函數從我的庫中的可執行文件,可執行文件最終是50 MB左右。

我已經通過py2exe的優化大小頁面閱讀,並可以優化使用它的一些建議。

http://www.py2exe.org/index.cgi/OptimizingSize

我猜我真的要求的最佳實踐在這裏。有沒有辦法阻止依賴關係處於未使用函數或類的庫的導入?我看過導入語句是使用調試器執行的,看起來python只是在繼續之前用「def somefunction」「拾取」該行。在使用函數/類之前,其餘的導入是否完成?這意味着在一個函數或類的開頭部署高容量導入可以減少庫的其餘部分的開銷。

+0

這實際上是一個關於從Python代碼到二進制文件的轉換器的問題。你在使用哪種轉換器? –

+0

我不知道如何檢查?我正在使用python 2.6,如果有幫助 –

+0

你在說「將簡單的程序轉換成可執行文件......」。您將需要一些程序來執行此轉換。這個程序將決定包含哪些模塊。 –

回答

2

有效減少依賴關係的唯一方法是將工具箱拆分爲更小的模塊,並僅導入所需的模塊。

在未使用函數的開始處放置導入將阻止在運行時加載這些模塊,但由於它隱藏了依賴項,因此不鼓勵它們。而且,你的Python到可執行轉換器可能需要包含這些模塊,因爲Python的動態特性使得不可能靜態地確定實際調用哪些函數。

+0

是否有任何方法可以在程序中(對於解釋器)聲明哪些函數或類將被調用(即使在運行時)。我從X導入Y的初始解釋是告訴解釋器,我需要的是唯一的特定函數或方法。 –

+0

@PaulSeeb:聲明這一點的唯一方法是編寫小模塊,並只包含您需要的模塊。 –

+0

這是應該使用包來完成的事情嗎? –