Python 优化金佳2号环境创造

Python 优化金佳2号环境创造,python,google-app-engine,jinja2,Python,Google App Engine,Jinja2,我的应用程序运行在Google App Engine上,由于CPU使用率高,大多数请求都会不断收到黄色标志。使用profiler,我跟踪到创建jinja2.Environment实例的例程 我正在模块级创建实例: from jinja2 import Environment, FileSystemLoader jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS)) 由于Google AppEngine操作模式(CGI),此

我的应用程序运行在Google App Engine上,由于CPU使用率高,大多数请求都会不断收到黄色标志。使用profiler,我跟踪到创建
jinja2.Environment
实例的例程

我正在模块级创建实例:

from jinja2 import Environment, FileSystemLoader
jinja_env = Environment(loader=FileSystemLoader(TEMPLATE_DIRS))
由于Google AppEngine操作模式(CGI),此代码可以在每次请求时运行(他们的模块导入缓存似乎将模块缓存几秒钟而不是几分钟)

我曾考虑将环境实例存储在memcache中,但它似乎不可拾取
FileSystemLoader
实例似乎是可拾取的,并且可以缓存,但我没有观察到这种方法在CPU使用方面有任何实质性的改进

任何人都可以提出一种方法来减少创建
jinja2.Environment
实例的开销

编辑:以下是探查器输出的(相关)部分

222172 function calls (215262 primitive calls) in 8.695 CPU seconds

 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     33    1.073    0.033    1.083    0.033 {google3.apphosting.runtime._apphosting_runtime___python__apiproxy.Wait}
438/111    0.944    0.002    2.009    0.018 /base/python_dist/lib/python2.5/sre_parse.py:385(_parse)
   4218    0.655    0.000    1.002    0.000 /base/python_dist/lib/python2.5/pickle.py:1166(load_long_binput)
      1    0.611    0.611    0.679    0.679 /base/data/home/apps/with-the-flow/1.331879498764931274/jinja2/environment.py:10()

一个电话,但据我所知(这在我所有基于GAE的应用程序中都是一致的),是整个请求处理周期中最昂贵的。

好的,各位,这是我今天在#pocoo上得到的:

[20:59]zgoda:您好,我想知道我是否可以优化我的jinja2环境创建过程,问题->

[21:00]zgoda:我有来自“冷”应用程序的分析器输出->

[21:01]zgoda:而对于“热”->

[21:02]zgoda:我想知道我是否可以降低为“冷”请求创建环境的CPU成本

[21:05]mitsuhiko:zgoda:将环境创建放在导入的模块中

[21:05]光之子:就像

[21:05]mitsuhiko:来自yourapplication.utils导入环境

zgoda:它已经在那里了

[21:06]光之子:嗯

[21:06]mitsuhiko:我认为问题在于每次访问都会重新编译模板

[21:06]mitsuhiko:不幸的是,gae有限,我不知道目前我能做的还有多少

[21:07]zgoda:我试过使用jinja bytecache,但它在prod上不起作用(它在开发服务器上)

[21:08]光之子:我知道

[21:08]光之子:阿彭金没有元帅

[21:12]zgoda:光之子:谢谢

[21:13]zgoda:我希望我做错了什么,这可以优化

[21:13]mitsuhiko:zgoda:下一个版本将提供改进的appengine支持,但我还不确定如何为ae实现改进的缓存


看起来Armin已经意识到AppEngine上字节码缓存的问题,并计划改进Jinja2以允许在GAE上进行缓存。我希望随着时间的推移情况会好转。

根据这一点,您可以使用memcache来缓存字节码。还可以缓存模板文件内容本身。所有这些都是一样的

Armin建议将Jinja2模板预编译为python代码,并在生产中使用编译后的模板。因此,我已经为此制作了一个编译器/加载器,现在它可以使一些复杂模板的渲染速度提高13倍,从而省去了所有的解析开销。与存储库链接相关的讨论是。

环境调用的哪一部分导致了痛苦?我们能看到配置文件信息吗?感谢您提供的配置文件信息,它并没有真正说明这一点(除了4000次调用pickle!)。我想我需要了解整件事。也许到freenode上的#pocoo来,我们可以聊聊?我对在App Engine上使用jinja2非常感兴趣,所以我很高兴听到您在这方面取得的任何进展。好的,我将尝试在各个州收集尽可能多的评测数据。当然,必须有一种方法使其加载速度至少与内置的django模板库大致相同,除非他们给予它某种特殊的预加载特权……稍后,IRC Armin说他对如何改进GAE有一些想法。有一些希望Peterh发表了一篇可能会有所帮助的帖子:我看到了这一点,缓存模板加载器是我下一步可能进行优化的事情,但这并不能解决环境创建开销(以及在每个请求上重新编译模板)。marshal在google app engine上不可用,因此部分方法无法工作。我实际上正在将我的应用程序迁移到jinja。我会报告它是如何运行的(谢谢,罗德里戈,这正是我一直在寻找的。)那里的大多数链接不再有效。你能分享一下储存库吗?