Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将多个Python源文件连接到单个文件中?_Python_Google App Engine_Import_Module_Concatenation - Fatal编程技术网

如何将多个Python源文件连接到单个文件中?

如何将多个Python源文件连接到单个文件中?,python,google-app-engine,import,module,concatenation,Python,Google App Engine,Import,Module,Concatenation,(假设:应用程序启动时间非常关键;我的应用程序启动频繁;我的应用程序在导入速度比平时慢的环境中运行;需要导入许多文件;无法编译到.pyc文件。) 我想将定义模块集合的所有Python源文件连接到一个新的Python源文件中 我希望导入新文件的结果就像导入了一个原始文件一样(然后再导入一些原始文件,依此类推) 这可能吗 这里是一个粗略的手动模拟,当输入模块“bar”和“baz”的源文件时,工具可能会产生什么。您可以在部署代码之前运行这样的工具 __file__ = 'foo.py' def _m

(假设:应用程序启动时间非常关键;我的应用程序启动频繁;我的应用程序在导入速度比平时慢的环境中运行;需要导入许多文件;无法编译到
.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源文件的延迟会造成伤害。

我认为,由于Python文件的预编译和一些系统缓存,最终获得的速度将无法衡量。

如果这是在google app engine上,如标签所示,确保你使用的是这个成语

def main(): 
    #do stuff
if __name__ == '__main__':
    main()
由于GAE不会在每次请求时重新启动应用程序,除非.py已更改,所以它只会再次运行
main()

这个技巧可以让你编写CGI风格的应用程序,而不会影响启动性能

如果处理程序脚本提供main() 例程,也包括运行时环境 缓存脚本。否则 处理程序脚本为每个 请求


这样做不太可能带来任何性能好处。您仍然在导入相同数量的Python代码,只是在更少的模块中—并且您正在为此牺牲所有的模块性


更好的方法是修改您的代码和/或库,以便只在需要时导入内容,以便为每个请求加载最少的所需代码。

如果不考虑这个问题,即此技术是否会提高您环境中的性能,假设您是对的,我会这样做

我会列出我所有的模块,例如。
myu文件=['foo','bar','baz']

然后,我将使用os.path实用程序读取源目录下所有文件中的所有行,并将它们全部写入一个新文件,过滤所有
import foo | bar | baz
行,因为所有代码现在都在一个文件中


最后,在文件的末尾添加
main()
(如果有)来自
\uu init\uuuuuuuuupy
(如果有)的
main()

您有任何数字可以证明这会影响解释器的启动时间吗?启动时间肯定是个问题。我希望这能加快速度。我已经澄清了问题中的限制。我也怀疑你是否会在这里看到加速。每次应用程序重新加载时,您仍然需要向VM中加载X行代码。在花时间将模块统一到一个大文件中之前,“…在花时间将模块统一到一个大文件中之前。”您错过了最后一行:“是否有任何现有代码可以使用此技术或其他技术组装源文件?”。我不打算这样写源代码,我希望在部署之前处理现有的源代码。我也希望这是一种其他人已经尝试过的技术,这样我就不用写了:-)你的意思是“不可测量”?.pyc文件的预编译不可用。在这种特殊情况下,缓存没有我希望的那么好。我已经在问题中澄清了这一点。谢谢,但我已经这样做了。请注意,app engine通常只缓存一秒钟左右,每天有14000左右的机会缓存未命中,这在使用具有复杂导入依赖关系的许多模块时会加剧。我真的对最大的启动性能很感兴趣。我不会牺牲所有的模块化,因为我建议在部署之前使用工具处理我的源代码,就像现代javascript工具在部署到实际浏览器之前组合、拆分和优化javascript一样。说“编写代码只导入所需内容”是个好主意,但这样就排除了在core django中使用300 od源文件,不包括contrib模块、外部库和我可能编写的任何内容。此外,你经常想导入很多代码,因为你确实在使用它。Nick,你在Google工作,你能描述一下在App Engine上加载和部署用户代码的过程吗?这不仅仅是由于加载了多个模块(如在传统设置中)而导致的磁盘搜索成本,因为并非所有用户代码都同时部署到所有实例。实际上是如何做到的?实际上是如何做到的?所有文件是一起部署的,一次部署一个,还是成批部署?自定义邮政编码是如何工作的?当您从zip加载一个模块时,是加载了其中的所有模块,还是按需加载?等等……如果有“300多个”源文件对于按需导入是一个问题,那么如果您想将它们全部连接起来,则同样是一个问题——任何一个都需要大量修改。使用Django这样的大型框架的问题在于,正如您所观察到的,导入需要很长时间。不过,我怀疑您在任何给定的请求中使用了超过20%左右的模块。不确定您从何处获得了“按需”部署代码的想法-您可以使用os.listdir等函数来确定情况并非如此。同样,你可以