akd*_*dom 42 python optimization performance
这真的是两个问题,但是它们非常相似,为了保持简单,我想我只是把它们放在一起:
首先:鉴于已经建立的python项目,除了简单的代码内优化之外,有什么方法可以加快速度?
其次:在python中从头开始编写程序时,有哪些好方法可以大大提高性能?
对于第一个问题,想象一下你得到了一个写得很好的项目,你需要提高性能,但你似乎无法通过重构/优化获得很多收益.在这种情况下你会做些什么来加速它,而不是像C那样重写它?
S.L*_*ott 43
关于"第二:在python中从头开始编写程序时,有哪些好方法可以大大提高性能?"
记住杰克逊的优化规则:
而Knuth规则:
不要随意优化.首先要做对.然后快点.优化错误的程序仍然是错误的.
记住80/20规则.
始终运行"之前"和"之后"基准.否则,你不会知道你是否找到了80%.
使用正确的算法和数据结构.这个规则应该是第一个.没有什么比算法和数据结构更重要了.
底线
您无法阻止或避免"优化此程序"的努力.这是工作的一部分.您必须对其进行规划并仔细进行,就像设计,代码和测试活动一样.
I G*_*ERS 27
我建议:而不是仅仅向C投入,
让你的代码计数.使用较少的行执行执行更多操作:
numpy
.Twisted
框架一样.如果以上所有内容都无法用于分析和测量代码,那么就开始考虑C重写路径.
Joh*_*kin 24
通常的嫌疑人 - 描述它,找到最昂贵的线,弄清楚它正在做什么,修复它.如果您之前没有进行太多的分析,可能会有一些大的胖二次循环或字符串重复隐藏在其他看似无害的表达式之后.
在Python中,我发现非明显减速的两个最常见的原因是字符串连接和生成器.由于Python的字符串是不可变的,所以做这样的事情:
result = u""
for item in my_list:
result += unicode (item)
Run Code Online (Sandbox Code Playgroud)
将每次迭代复制整个字符串两次.这已经很好地解决了,解决方案是使用"".join
:
result = "".join (unicode (item) for item in my_list)
Run Code Online (Sandbox Code Playgroud)
发电机是另一个罪魁祸首.它们非常易于使用并且可以极大地简化某些任务,但是应用程序不良的生成器将比仅仅将项目附加到列表并返回列表要慢得多.
最后,不要害怕重写C中的位!Python作为一种动态的高级语言,根本无法匹配C的速度.如果有一个函数无法在Python中进行优化,请考虑将其解压缩到扩展模块.
我最喜欢的技术是维护模块的Python和C版本.编写的Python版本尽可能清晰明了 - 任何错误都应该易于诊断和修复.针对此模块编写测试.然后编写C版本并进行测试.在所有情况下,它的行为应该与Python实现的行为相同 - 如果它们不同,应该很容易找出哪个是错误的并纠正问题.
Cython和pyrex可用于使用类似python的语法生成c代码.Psyco对于合适的项目来说也是很棒的(有时你不会注意到速度提升很多,有时它会快50倍).我仍然认为最好的方法是分析你的代码(cProfile等),然后将瓶颈编码为python的c函数.
我很惊讶没有人提到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
我希望你读过:http://wiki.python.org/moin/PythonSpeed/PerformanceTips
恢复已有的通常有3个原则:
归档时间: |
|
查看次数: |
20613 次 |
最近记录: |