控制python导入以减少大小和开销

时间:2012-06-22 15:27:02

标签: python optimization import size

我创建了许多个人库来帮助我进行日常编码。最佳做法是将导入放在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

我想我真的在这里要求最佳实践。有没有办法阻止导入依赖于未使用的函数或类的库?我已经看过使用调试器执行import语句,看起来python只是在继续之前用“def somefunction”“拾取”该行。在使用函数/类之前,导入的其余部分是否未完成?这意味着在函数或类的开头放置高容量导入可以减少库的其余部分的开销。

1 个答案:

答案 0 :(得分:2)

有效减少依赖关系的唯一方法是将工具箱拆分为较小的模块,并仅导入所需的模块。

将导入放在未使用的函数的开头会阻止在运行时加载这些模块,但不鼓励它们隐藏依赖项。此外,你的Python到可执行转换器可能还需要包含这些模块,因为Python的动态特性使得无法静态地确定实际调用哪些函数。