(假设:应用程序启动时间绝对至关重要;我的应用程序启动很多;我的应用程序在导入比平常慢的环境中运行;需要导入许多文件;以及编译到.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()
此代码不考虑import语句和依赖项之类的内容。是否有任何现有的代码可以使用它或其他技术来组合源文件?
这与用于在发送到浏览器之前组装和优化JavaScript文件的工具非常相似,其中多个HTTP请求的延迟会损害性能。在这个Python案例中,它是在启动时导入数百个Python源文件的延迟,这会造成伤害。
答案 0 :(得分:3)
如果这是在谷歌应用引擎上,如标签所示,请确保您使用此成语
def main():
#do stuff
if __name__ == '__main__':
main()
由于GAE不会在每次请求时重新启动您的应用,除非.py已更改,它只会再次运行main()
。
这个技巧可以让你编写CGI风格的应用程序而不会影响启动性能
如果处理程序脚本提供main() 例程,运行时环境也 缓存脚本。否则, 处理程序脚本为每个加载 请求。
答案 1 :(得分:1)
我认为由于Python文件的预编译和一些系统缓存,你最终得到的速度将无法衡量。
答案 2 :(得分:0)
这样做不太可能产生任何性能优势。您仍在导入相同数量的Python代码,只需要更少的模块 - 而且您牺牲了所有模块化。
更好的方法是修改代码和/或库,只在需要时导入内容,以便为每个请求加载最少的必需代码。
答案 3 :(得分:0)
如果没有处理这个问题,不管这种技术是否可以增强你环境中的东西,说你是对的,这就是我要做的事情。
我会列出所有模块,例如
my_files = ['foo', 'bar', 'baz']
然后我会使用os.path实用程序读取源目录下所有文件中的所有行,并将它们全部写入新文件,过滤所有import foo|bar|baz
行,因为所有代码现在都在一个文件中。< / p>
诅咒,最后在文件的尾部添加main()
__init__.py
(如果有的话)。