当前位置:  开发笔记 > 编程语言 > 正文

加速Python

如何解决《加速Python》经验,为你挑选了7个好方法。

这真的是两个问题,但是它们非常相似,为了保持简单,我想我只是把它们放在一起:

首先:鉴于已经建立的python项目,除了简单的代码内优化之外,有什么方法可以加快速度?

其次:在python中从头开始编写程序时,有哪些好方法可以大大提高性能?

对于第一个问题,想象一下你得到了一个写得很好的项目,你需要提高性能,但你似乎无法通过重构/优化获得很多收益.在这种情况下你会做些什么来加速它,而不是像C那样重写它?



1> S.Lott..:

关于"第二:在python中从头开始编写程序时,有哪些好方法可以大大提高性能?"

记住杰克逊的优化规则:

规则1:不要这样做.

规则2(仅限专家):不要这样做.

而Knuth规则:

"过早优化是万恶之源."

优化的一般规则中有更多有用的规则.

    不要随意优化.首先要做对.然后快点.优化错误的程序仍然是错误的.

    记住80/20规则.

    始终运行"之前"和"之后"基准.否则,你不会知道你是否找到了80%.

    使用正确的算法和数据结构.这个规则应该是第一个.没有什么比算法和数据结构更重要了.

底线

您无法阻止或避免"优化此程序"的努力.这是工作的一部分.您必须对其进行规划并仔细进行,就像设计,代码和测试活动一样.



2> I GIVE CRAP ..:

我建议:而不是仅仅向C投入,

让你的代码计数.使用较少的行执行执行更多操作:

将算法更改为更快的算法.在许多情况下,不需要花时间更快.

使用恰好用C语言编写的python原语.有些东西会迫使解释器发送到某些地方.后者是优选的

注意首先构建大数据结构然后使用其消耗的代码.想想范围和xrange之间的区别.通常,通常值得考虑程序的内存使用情况.使用生成器有时可以将O(n)内存使用降低到O(1).

Python通常是非优化的.从循环中提升不变代码,在紧密循环中尽可能消除常见的子表达式.

如果某些东西很贵,那么预计算或记忆它.例如,可以编译正则表达式.

需要紧缩数字?你可能想看看numpy.

许多python程序很慢,因为它们受磁盘I/O或数据库访问的约束.确保在等待数据到达而不仅仅是阻止时有值得做的事情.武器可能就像Twisted框架一样.

请注意,许多关键的数据处理库都有C版本,无论是XML,JSON还是诸如此类的东西.它们通常比Python解释器快得多.

如果以上所有内容都无法用于分析和测量代码,那么就开始考虑C重写路径.



3> John Milliki..:

通常的嫌疑人 - 描述它,找到最昂贵的线,弄清楚它正在做什么,修复它.如果您之前没有进行太多的分析,可能会有一些大的胖二次循环或字符串重复隐藏在其他看似无害的表达式之后.

在Python中,我发现非明显减速的两个最常见的原因是字符串连接和生成器.由于Python的字符串是不可变的,所以做这样的事情:

result = u""
for item in my_list:
    result += unicode (item)

将每次迭代复制整个字符串两次.这已经很好地解决了,解决方案是使用"".join:

result = "".join (unicode (item) for item in my_list)

发电机是另一个罪魁祸首.它们非常易于使用并且可以极大地简化某些任务,但是应用程序不良的生成器将比仅仅将项目附加到列表并返回列表要慢得多.

最后,不要害怕重写C中的位!Python作为一种动态的高级语言,根本无法匹配C的速度.如果有一个函数无法在Python中进行优化,请考虑将其解压缩到扩展模块.

我最喜欢的技术是维护模块的Python和C版本.编写的Python版本尽可能清晰明了 - 任何错误都应该易于诊断和修复.针对此模块编写测试.然后编写C版本并进行测试.在所有情况下,它的行为应该与Python实现的行为相同 - 如果它们不同,应该很容易找出哪个是错误的并纠正问题.


要添加到该注释:在2.5(和2.6)中字符串连接不是那么糟糕的原因是在CPython中有这种情况的特定优化(但不一定是任何其他Python实现).

4> tzot..:

首先想到的是:psyco.它暂时只在x86上运行.

然后,不断绑定.也就是说,使所有全局引用(以及global.attr,global.attr.attr ...)成为函数和方法内的本地名称.这并不总是成功的,但总的来说它是有效的.它可以手工完成,但显然很乏味.

你说除了代码内优化之外,所以我不会深入研究这个问题,但是请注意for i in range(10000000)人们所做的典型错误(脑海中浮现).



5> hacama..:

Cython和pyrex可用于使用类似python的语法生成c代码.Psyco对于合适的项目来说也是很棒的(有时你不会注意到速度提升很多,有时它会快50倍).我仍然认为最好的方法是分析你的代码(cProfile等),然后将瓶颈编码为python的c函数.



6> torial..:

我很惊讶没有人提到ShedSkin:http://code.google.com/p/shedskin/,它会自动将你的python程序转换为C++,并且在一些基准测试中比psyco在速度上产生更好的改进.

关于简洁性的轶事故事:http://pyinsci.blogspot.com/2006/12/trying-out-latest-release-of-shedskin.html

但是有一些限制,请参阅:http://tinyurl.com/shedskin-limitations



7> ionelmc..:

我希望你读过:http://wiki.python.org/moin/PythonSpeed/PerformanceTips

恢复已有的通常有3个原则:

编写在更好的字节码中转换的代码,比如,使用本地,避免不必要的查找/调用,使用惯用的构造(如果有你想要的自然语法,使用它 - 通常更快.例如:不要这样做:"for key in some_dict.keys()",do"for some_dict中的键")

用C语言编写的内容要快得多,滥用你可用的任何C函数/模块

如有疑问,请导入时间,个人资料

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有