加速Python
这实际上是两个问题,但它们非常相似,为了简单起见,我想我会把它们放在一起:
首先 :给定一个已建立的python项目,有什么体面的方法可以加速它不仅仅是简单的代码内优化?
其次 :在python中从头开始编写程序时,有什么方法可以大大提高性能?
对于第一个问题,假设你是一个写得很好的项目,你需要提高性能,但你似乎无法通过重构/优化获得很大的收益。 在这种情况下,你会怎么做才能加快速度,而不是像C一样重写它?
关于“其次:在python中从头开始编写程序时,有什么方法可以大大提高性能?”
记住杰克逊优化规则:
Knuth规则:
“优化总则”中更有用的规则。
不要随意优化。 首先说得对。 然后快速获取它。 优化错误的程序仍然是错误的。
记住80/20规则。
始终运行“之前”和“之后”的基准。 否则,你不会知道你是否找到了80%。
使用正确的算法和数据结构。 这条规则应该是第一位的。 没有什么问题像算法和数据结构。
底线
您无法阻止或避免“优化此计划”的努力。 这是工作的一部分。 您必须对其进行规划并仔细执行,就像设计,代码和测试活动一样。
我不建议只用C来踢C,我会建议:
让你的代码数。 以更少的行数执行更多的事情:
numpy
。 Twisted
框架一样。 如果上述所有内容都失败了,那么就开始考虑C-rewrite路径。
通常的嫌疑人 - 描述它,找到最昂贵的线路,找出它在做什么,修复它。 如果你以前没有做过太多的分析,可能会出现一些大的二次方形循环或字符串重复,隐藏在看起来无害的表达式后面。
在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实现的行为相同 - 如果它们不同,应该很容易找出哪些是错误的并纠正了问题。
链接地址: http://www.djcxy.com/p/39589.html上一篇: Speeding Up Python