Python性能提升的一些技巧(持续更新)
一般编程语言性能比较这个网站比较有说服力http://benchmarksgame.alioth.debian.org/u64q/ruby.html,现在的情况是python的速度在比较列表编程语言中属于垫底的,但是这并不是说python不可取,pytthon慢到不能工作,通过一些简单的优化和编码规范python的速度还是不错的,整天挂在嘴边python性能不行的都是小白,你要做的系统需要百万并发吗?需要误差在10毫秒内的实时交易吗?需要千万级别服务器端口扫描吗?需要DDOS级别的压力测试吗?需要几个小时内一亿次的弱密码爆破吗?如果你需要,一亿级别爆破和生产环境中的10000QPS个人都用python+c扩展的方式实现过,我可以帮你。
其实绝大多是场景python都能很好的工作,一些对性能要求比较高的场景通过python+c扩展的形式都是可以搞定的,而且省时省力。
以前群里总有个成员成天埋怨,python性能怎么差,自己用起来怎么费力,而不去寻找性能瓶颈在哪儿怎么去做优化。要记住,自己菜逼,怪编程语言是没有用的,这就像蹲坑拉屎,便秘拉不出来,说马桶这个地方地球吸引力太小,听说后来那位朋友去学scala了,还有人说他去学golang了,祝他早日找到自己心中的完美语言。
- python的编码规范
- 用生成器和列表推导式
- 字符串连接如果数量在3个或3个以内,直接用+号,超过3个,用format或者join,join最好,但format和join差别不是很大
- 不要写递归代码,尾递归也不行,改成循环的形式
- tuple能解决问题就不要用list,同样set能解决问题就不要用dict,但是dict和list相比,dict速度飞快,就是内存占用大。但是不要刻意去把list转为tuple。
- 函数能用局部变量,就不要用全局变量
- 交换变量用pythonic的方式,a,b=b,a就这样
- map有时候可以代替循环,这个时候应该毫不犹豫的使用map
- 在循环内部尽量减少不必要的非循环步骤
- 用while 1别用while True
- 多个变量值比较的时候可以用a
- 计算x的y次幂用x**y,别用pow,难读速度还慢
- cpu密集计算别用python,即使要用,也要选择numpy之类的库,最好把cpu密集部分改成C代码,然后ctypes调用,cpu密集部分也不推荐cython,总之C扩展>numpy=cython>python
有些规范和语言无关,就是用C如果你的程序逻辑有问题,还是会慢。