Python 加速器
我打算用Python来开发一个网页应用。有没有人知道Python有没有什么加速器?就像PHP的eAccelerator或者apc那样。如果没有,有没有办法缓存预编译的Python字节码?
还有,关于Python和PHP的性能比较有什么想法吗?假设数据库和网络延迟是一样的。
提前谢谢大家。
4 个回答
只要你在“主脚本”中做的工作很简单(就是你直接用 python
命令运行的那个脚本,它的 __name__
会是 __main__
),你就不需要担心“缓存预编译的 Python 字节码”。当你用 import foo
导入一个模块时,foo.py
会被保存到磁盘上(和它在同一个文件夹里),变成 foo.pyc
,只要这个文件夹是你可以写入的。这样,编译成字节码的过程就只会发生一次,以后每次 Python 运行时都会直接加载 foo.pyc
,每当有新的进程执行 import foo
时,都是这样。在同一个进程中,除了第一次以外,每次 import foo
都只是快速查找内存中的一个字典(sys.module
字典)。这是 Python 的一个核心性能理念:确保所有重要的代码都放在模块的 def
语句里——不要在模块的顶层、主脚本中,或者特别是在 exec
和 eval
语句/表达式中放置这些代码!
我没有关于 PHP 和 Python 的性能对比数据,但我注意到 Python 在每次新版本发布时都会明显优化,所以如果你想看到“最快的 Python”,一定要比较最近的版本(理想情况下是 2.7,至少要 2.6)。如果你觉得它还不够快,cython
(一种可以直接编译成 C 的 Python 方言,之后再编译成机器代码,但有一些限制)是目前最简单的方法,可以选择性地优化那些通过性能分析发现需要优化的模块。
这里有个小窍门。
它叫做 mod_wsgi
。
它的基本原理是这样的:
对于“静态”内容(比如 .css、.js、图片等),把它们放在一个文件夹里,让 Apache 直接提供这些文件,而你的 Python 程序并不知道这些文件被发送了。
对于“动态”内容(也就是主要的 HTML 页面),你使用
mod_wsgi
来启动一个“后端”进程,这个进程在 Apache 之外运行。
这样比 PHP 快,因为现在有好几件事情可以同时进行。Apache 把请求发给后端进程后,就可以继续处理下一个请求,而后端进程还在处理第一个请求。
而且,当你发送了 HTML 页面后,后续的请求由 Apache 处理,而你的 Python 程序并不知道或不在乎发生了什么。这就大大提高了速度。这和 Python 的速度没关系,完全是架构设计的问题。
其他人提到了Python的字节码文件,但这其实没什么关系。因为除了CGI以外,Python的托管方式会在请求之间把Python网页应用保留在内存中。这和PHP不一样,PHP在请求之间基本上会把应用丢掉。因此,Python不需要加速器,因为Python的托管方式避免了PHP所面临的问题。