我目前正在尝试优化我的网站,该网站运行在google的appengine上.这不是一件容易的事,因为我没有使用任何强大的工具.
有没有人有为此目的优化python代码的经验?你有没有找到一个好的python profiler?
我发现Gprof2Dot非常有用.分析模块的输出我试过非常不直观地解释.
Gprof2Dot将cProfile输出转换为漂亮的图形,突出显示最慢的链(?),以及每个函数的一些信息(函数名称,此函数花费的时间百分比和调用次数).
示例图(1429x1896px)
我没有对App Engine做太多工作,但在分析非webapp脚本时,我倾向于分析运行所有单元测试的脚本,这可能对现实世界的情况不太准确
一个(更好的?)方法是使用一个执行伪WSGI请求的脚本,然后对其进行分析.
WSGI是一个非常简单的协议,它基本上是一个带有两个参数的函数,一个带有请求信息,第二个带有回调函数(用于设置头文件等).也许类似于以下内容(这是可能的工作伪代码)......
class IndexHandler(webapp.RequestHandler): """Your site""" def get(self): self.response.out.write("hi") if __name__ == '__main__': application = webapp.WSGIApplication([ ('.*', IndexHandler), ], debug=True) # Start fake-request/profiling bit urls = [ "/", "/blog/view/hello", "/admin/post/edit/hello", "/makeanerror404", "/makeanerror500" ] def fake_wsgi_callback(response, headers): """Prints heads to stdout""" print("\n".join(["%s: %s" % (n, v) for n, v in headers])) print("\n") for request_url in urls: html = application({ 'REQUEST_METHOD': 'GET', 'PATH_INFO': request_url}, fake_wsgi_callback ) print html
实际上,App Engine文档解释了一种更好的分析应用程序的方法:
来自http://code.google.com/appengine/kb/commontasks.html#profiling:
要分析应用程序的性能,请先将应用程序的
main()
功能重命名为real_main()
.然后,在您的应用程序中添加一个新的main函数,profile_main()
如下所示:def profile_main(): # This is the main function for profiling # We've renamed our original main() above to real_main() import cProfile, pstats prof = cProfile.Profile() prof = prof.runctx("real_main()", globals(), locals()) print "" stats = pstats.Stats(prof) stats.sort_stats("time") # Or cumulative stats.print_stats(80) # 80 = how many to print # The rest is optional. # stats.print_callees() # stats.print_callers() print ""[...]
要使用您的应用程序启用分析,请进行设置
main = profile_main
.要正常运行您的应用程序,只需设置即可main = real_main
.
App Engine Mini Profiler是一款全新的嵌入式应用引擎性能工具,可为所有函数调用提供API调用性能信息(通过Appstats)和标准性能分析数据(通过cProfiler)
https://github.com/kamens/gae_mini_profiler