【发布时间】:2009-10-16 22:30:50
【问题描述】:
(假设:应用程序启动时间绝对关键;我的应用程序启动很多;我的应用程序运行在导入速度比平时慢的环境中;需要导入许多文件;编译到.pyc 文件不可用。)
我想将定义模块集合的所有 Python 源文件连接到一个新的 Python 源文件中。
我希望导入新文件的结果就像我导入了一个原始文件(然后会导入更多原始文件,依此类推)。
这可能吗?
这是一个粗略的手动模拟,当提供模块“bar”和“baz”的源文件时,工具可能会产生什么。您将在部署代码之前运行这样的工具。
__file__ = 'foo.py'
def _module(_name):
import types
mod = types.ModuleType(name)
mod.__file__ = __file__
sys.modules[module_name] = mod
return mod
def _bar_module():
def hello():
print 'Hello World! BAR'
mod = create_module('foo.bar')
mod.hello = hello
return mod
bar = _bar_module()
del _bar_module
def _baz_module():
def hello():
print 'Hello World! BAZ'
mod = create_module('foo.bar.baz')
mod.hello = hello
return mod
baz = _baz_module()
del _baz_module
现在你可以:
from foo.bar import hello
hello()
此代码未考虑导入语句和依赖项等内容。是否有任何现有代码可以使用这种或其他技术来组装源文件?
这与用于在发送到浏览器之前组装和优化 JavaScript 文件的工具非常相似,其中多个 HTTP 请求的延迟会损害性能。在这个 Python 案例中,在启动时导入数百个 Python 源文件的延迟会造成伤害。
【问题讨论】:
-
您是否有任何数字可以证明这会影响解释器的启动时间?
-
启动时间肯定是个问题。我希望这会加快速度。我已经澄清了问题中的限制。
-
我也怀疑你会在这里看到加速。每次重新加载应用程序时,您仍然需要将 X 行代码加载到 VM 中。在花时间将您的模块统一到一个大文件中之前,我肯定会花时间确认这会加快您的速度。
-
"...在花时间将您的模块统一到一个大文件之前。"您错过了最后一行:“是否有任何 现有 代码可以使用这种或其他技术组装 源文件?”。我不建议编写这样的源代码,我想在部署之前处理现有的源代码。我也希望这是其他人尝试过的一种技术,这样我就不必编写它了:-)
标签: python google-app-engine import module concatenation