使用WingIDE时,Google App Engine开发服务器启动缓慢
我正在使用Google App Engine进行开发。为了在开发服务器上调试,我使用的是WingIDE(一个Python的开发工具)。我的数据存储中有几千个实体,每当开发服务器启动时,它需要通过DatastoreFileStub.Read()来处理每一个实体。
问题是,当我通过WingIDE运行开发服务器时,速度非常慢。我在Google App Engine中加入了一些性能监测的代码,想看看具体情况。
当我在命令行中运行开发服务器时,看到的信息是:
读取10374个实体花费了10.17秒,每秒读取1019个
而当我通过WingIDE运行开发服务器时,看到的信息却是:
读取10374个实体花费了52.44秒,每秒读取197个
有人知道为什么通过WingIDE会慢5倍吗?
2 个回答
一个想法是使用wingdbstub在程序启动完成后开始调试。你需要在代码的某个地方加上'import wingdbstub',这个位置可以是启动后任何地方。当然,这个模块必须在Python的路径中,IDE也需要配置成可以接收连接,同时你还需要设置一些基本的安全措施——这些内容在http://wingware.com/doc/debug/importing-the-debugger上有详细说明。
另外,还有一个API可以让你更早地开始调试,并且在调试开销太大的地方暂时关闭调试功能。具体可以查看http://wingware.com/doc/debug/debugger-api。
调试器的开销是个棘手的问题(至少对于CPython来说),因为它和执行的Python字节码数量成正比。从Python代码中并不总是能明显看出有多少时间是在解释器中运行字节码,多少时间是在C/C++库或Python内部。比如,嵌套的Python循环如果处理大量数据,在调试器中运行时会变得非常慢,尤其是当它们大部分工作都是在Python中完成时。不过在很多情况下,大部分工作其实是在Python内部或库代码中完成的,这样调试器就不会拖慢速度那么多。
可能是因为你连接了调试器——调试器会让代码运行得很慢,因为它会对所有东西进行监控,而从数据存储中读取数据是个很费劲的活。
使用 --use_sqlite 这个选项可以启用一个实验性的基于sqlite的本地数据存储,这样启动时间应该会更短。不过要注意,当你切换到这个选项时,你需要清空你的数据存储。