2012-06-22 115 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

这是应该使用包来完成的事情吗? –