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

Pau*_*eeb 6 python size import optimization

我创建了许多个人库来帮助我进行日常编码。最佳实践是将导入放在 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
Run Code Online (Sandbox Code Playgroud)

函数 foo 使用 difflib。现在说我正在编写一个需要使用 bar 和 foobar 的新程序。我可以写

import pytools
...
item = pytools.foobar()
vals = pytools.bar()
Run Code Online (Sandbox Code Playgroud)

或者我可以做

from pytools import foobar, bar
...
item = foobar()
vals = bar()
Run Code Online (Sandbox Code Playgroud)

这两种选择是否会减少开销或排除 foo 的导入及其对 difflib 的依赖?如果 difflib 的导入是在 foo 函数内部呢?

我遇到的问题是,将简单程序转换为仅使用我的库中的一两个类或函数的可执行文件时,可执行文件最终为 50 mb 左右。

我已经阅读了 py2exe 的优化大小页面,并且可以使用它的一些建议进行优化。

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

我想我真的在这里寻求最佳实践。是否有某种方法可以阻止导入依赖项位于未使用的函数或类中的库?我看过使用调试器执行的 import 语句,看起来 python 在继续之前只“拿起”带有“def somefunction”的行。在使用函数/类之前,导入的其余部分是否未完成?这意味着在函数或类的开头放置大量导入可以减少库其余部分的开销。

Sve*_*ach 5

有效减少依赖性的唯一方法是将工具箱拆分为更小的模块,并仅导入您需要的模块。

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