加速Python

这实际上是两个问题,但它们非常相似,为了简单起见,我想我会把它们放在一起:

  • 首先 :给定一个已建立的python项目,有什么体面的方法可以加速它不仅仅是简单的代码内优化?

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

  • 对于第一个问题,假设你是一个写得很好的项目,你需要提高性能,但你似乎无法通过重构/优化获得很大的收益。 在这种情况下,你会怎么做才能加快速度,而不是像C一样重写它?


    关于“其次:在python中从头开始编写程序时,有什么方法可以大大提高性能?”

    记住杰克逊优化规则:

  • 规则1:不要这样做。
  • 规则2(仅适用于专家):不要这样做。
  • Knuth规则:

  • “不成熟的优化是万恶之源。”
  • “优化总则”中更有用的规则。

  • 不要随意优化。 首先说得对。 然后快速获取它。 优化错误的程序仍然是错误的。

  • 记住80/20规则。

  • 始终运行“之前”和“之后”的基准。 否则,你不会知道你是否找到了80%。

  • 使用正确的算法和数据结构。 这条规则应该是第一位的。 没有什么问题像算法和数据结构。

  • 底线

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


    我不建议只用C来踢C,我会建议:

    让你的代码数。 以更少的行数执行更多的事情:

  • 将算法更改为更快的算法。 在许多情况下,并不需要看起来更快。
  • 使用碰巧写在C中的Python原语。有些东西会强制解释器调度,其中一些不会。 后者是可取的
  • 谨防首先构建大数据结构并遵循其规范的代码。 想想范围和xrange之间的区别。 一般来说,通常值得考虑程序的内存使用情况。 使用生成器有时会将O(n)内存使用降至O(1)。
  • Python通常是非优化的。 在循环中提升不变代码,在紧密循环中尽可能消除常见的子表达式。
  • 如果有些东西很贵,那么预先计算或记忆它。 正则表达式可以编译为例子。
  • 需要紧缩数字? 你可能想检查numpy
  • 许多python程序很慢,因为它们受磁盘I / O或数据库访问的约束。 确保你在等待数据到达时有一些值得做的事情,而不是仅仅阻止。 武器可能就像Twisted框架一样。
  • 请注意,许多关键的数据处理库都有C版本,无论是XML,JSON还是其他。 它们通常比Python解释器快得多。
  • 如果上述所有内容都失败了,那么就开始考虑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

    下一篇: What are some best practices to build memory