Python 2.x与3.x的速度对比

35

我是一名博士生,使用Python编写用于研究的代码。我的工作流程经常包括对代码进行小改动、运行程序、查看结果是否有改进,并重复此过程。由于这个原因,我发现自己花费的时间更多是在等待程序运行而不是实际地编写代码(我知道这是一个普遍的经验)。目前我在系统上使用的是最新版本的Python 2,所以我的问题是转换到Python 3是否会给我带来任何速度提升。在这一点上,我真的没有什么强烈的理由去转向Python 3,因此如果执行速度相似,我可能会继续使用2.x版本。我知道我将不得不修改我的代码才能让它在Python 3中正常运行,因此要测试两个版本哪个运行更快并不容易。在我花费时间更新我的代码到Python 3之前,我需要相当有信心会获得速度提升。


9
对你的代码进行分析,并将最低效或最关键的部分用C语言重写,你怎么看? - Ross Rogers
2
这并不直接回答你的问题,但根据你的软件性质,你可以尝试使用Python的pickle模块轻松地存储和加载中间结果,这些结果不会受到你的更改影响。使用从初始运行收集的一些“虚拟数据”将使你重复的处理仅集中在你需要测试的更改上。 - ezod
7
请考虑使用 psyco(http://psyco.sourceforge.net/)和 unladen-swallow(http://code.google.com/p/unladen-swallow/wiki/Release2009Q3)。 - Ross Rogers
1
我同意Ross的观点,Psyco绝对是你的好帮手。假设你可以使用它(它无法在64位版本的Python上运行),它几乎是一个免费的速度提升。只需5分钟即可部署,你就会感到非常愉悦。Psyco不适用于Python 3.0,我不确定是否有任何计划使其适用于Python 3.0。 - Brian
1
我计划进行一些性能分析,只是想看看是否升级到Python 3可以快速简便地获得一些改进。 - Colin
显示剩余6条评论
5个回答

23

这篇文章(archive.org)说Python 3.0在一些方面实际上比Python 2.6慢,尽管我认为其中许多问题已经得到解决。话虽如此,Numpy还没有被移植到Python 3.0,而这正是很多高性能(用C编写)数字功能的所在之处。希望它会在2009年底或2010年初准备好。

你不应该考虑性能作为切换到Python 3的理由;我认为你不会看到持续的速度提升。

编辑:支持Python 3的Numpy版本已经发布。

编辑2:这个答案(以及其他回答这个问题的答案)已经过时了


那对我来说已经足够了。我刚开始学习Python,所以不确定Python 3的目标是什么,但速度似乎不是其中之一。 - Colin
希望它会在2009年末或2010年初准备好。(现在已经是2010年了,所以我怀疑他们是否能够达到2009年的发布日期 :)) - Corey Goldberg
@Colin:没错。更进一步地说,速度在很大程度上被忽略了。这种哲学可能是:“先让它工作,然后再让它更快。”Python 3 的目标:http://wiki.python.org/moin/Python3.0 - Brian

5

目前,Python 3 的速度与 Python 2 差不多... 如果你想要提高速度,可以考虑使用 Psyco、Cython 等其他工具,而不是比较 Python 3 和 Python 2。

但是,最近出现了将 Google 项目 Unladen Swallow(用于在 Python 上实现 JIT)与 Python 3 合并的计划。当然,这不会很快,但在一段时间后,也许 Python 3 的速度会显著提高。他们声称已经将速度提高了 10%(在 Python 2 上)。他们的目标是将速度提高到 5 倍。

更多信息请参见PEP 3146

编辑:正如 Brian 所指出的那样,PEP 3146 已被取消。


PEP 3146自从被撤回以来,已经不再适用。 - Brian
是的,完全正确... :-( (答案超过1年了)我会加注释 - Khelben

3

尝试优化算法或更改数据结构通常是提高性能的最佳方法。


2

我无法回答你问题的根源,但是如果你看到任何关于 io 模块性能不佳的内容,请忽略它。在 Python 3.0 中确实存在性能问题,但这些问题在 Python 3.1 中大部分得到了解决。


我在谷歌搜索时看到了一些相关内容。 很好知道。 - Colin
Eric,你有权威链接可以添加吗?我仍然认为(在阅读了“新功能”文档等内容后)虽然3.1大大改善了速度,但这并不意味着恢复到2.5的速度水平。 - Peter Hansen
我参加了与 Steve Holden 和 Eric Smith(Python 软件基金会主席和 3.1 变更的贡献者)的见面会,他们都说 io 模块比 3.0 好多了。我不记得他们是否评论了性能如何与 2.x 分支相比,因为那是几个月前的事了。所以我不能说 3.1 的 io 模块比 2.5 更好,但我可以说 3.1 比 3.0 更好。 - Eric Palakovich Carr
谢谢Eric,这很有帮助。我注意到io模块似乎正在被移植到2.7版本,所以我猜可以轻松比较旧版和新版的I/O性能。请参见http://docs.python.org/dev/whatsnew/2.7.html。 - Peter Hansen
2
在Planet Python上偶然发现了这个链接:http://www.dabeaz.com/blog/2010/01/reexamining-python-3-text-io.html。它描述了Python 3.1中的文本I/O仍然比2.6慢得多。虽然因为Unicode而变慢,但仍然较慢。值得一读。 - Peter Hansen

2

我有一项演化分析需要长时间运行,使用了大约六个Python脚本以及其他生物信息学软件(如muscle、clustal、blast甚至R!)。我使用临时文件保存中间结果,并使用子进程模块将所有部分粘合在一起的主脚本。很容易更改主脚本,只运行我想要测试的修改部分。但是,如果更改是针对早期步骤进行的,并且您只知道整个过程结束后它有多好,那么这种策略就不会有太大帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接