阿里云,腾讯云_关于python言语优化的一些思索

  • 阿里云,腾讯云_关于python言语优化的一些思索已关闭评论
  • 80 人浏览
  • A+
所属分类:首页

近来一向在做python工程化相干的事情,很有心得,遂总结一下。
一是为了整顿思路,二是为了解放本身忘记的大脑。

python是一个C的语法糖盒子

原生的python一般都是由cpython完成,而cpython的运转效力,确切让人不敢恭维,比较好的解决方案有cython、numba、pypy等等

cython

是如今我认为生长最好,最靠谱的一项Python加快解决方案。
阿里云,腾讯云_关于python言语优化的一些思索

运用cython编译事后的代码,一般会对原python代码有2倍以上的速率提拔。cython的编译也很简单,只须要构建一个setup.py,然后实行:

  python setup.py build_ext

numba

numba也是我比较看好的,它的亮点在于运用装潢器的体式格局运用jit手艺,比方下面的代码:

 @jit def run_xxx(): ...

可直接将run_xxx要领举行高效的c编译。
但在大多数运用场景下(尤其是采用了效劳拆分或微效劳的架构战略),这类功用反而让人有种鸡肋的觉得

只能说numba更适用于模子开发的场景,在模子运用和布置的环节,numba的作用很为难

pypy

pypy相对比较小众,这是由于它本身的限定前提较多,尤其是对python第三方包的支撑上面更是异常范围。由于我在做python开发的过程当中,常常须要限定版本,以及引入较多的第三方包,所以pypy就不在斟酌的范围内了

不要随意马虎置信宣称本身很快的模块和要领

曾经在网上看到有人发文,宣称numpy是如今python下异常高效的一个模块,而numpy的“娘亲们”,以至把本身夸上了天,说本身怎样怎样高效。而国内的一些伪专家们,也是自觉的“助桀为虐”,说什么假如你不太懂,请不要随意马虎去优化numpy如此,岂非你自认为优化的算法能赛过numpy里内置的久经考验的算法?
真的是误人子弟!许多人在这里就被唬住了,代码剖析到numpy的环节,就不敢往下走了。
我想说的是,对统统永久坚持疑心的精力才是真正的科学素养,是否是真的高机能,统统要用数据措辞。
刚开始,我也被短暂的唬住了,毕竟numpy的底层也没打仗过,但profiler剖析的效果告诉我,问题就出在numpy里,效果发如今我的项目场景里,运用dict能完整替换numpy的一切操纵,机能一下提高了许多,而numpy的高效在于ndarray
阿里云,腾讯云_关于python言语优化的一些思索

所以,采用什么数据结构要看运用场景,没有全能的高效数据结构

不要认为排除法是全能的

优化代码的过程当中,由于我的以往胜利“履历”,也致使走了不少弯路,最主要的,就是自觉运用排除法。运用排除法只能运用二分查找或快排的战略去构造代码,假如目的代码比较少还能够,事实上,在实在场景中每每有成百上千行目的代码。人工实行和完成O(logN)量级的操纵,似乎是一种蛮干。

这里有几个器量东西趁便记录下:

py_spy

https://github.com/benfred/py-spy
轻易的生成CPU实行要领的火焰图

line_profiler

https://github.com/rkern/line_profiler
逐行代码剖析,不要小视它的才能,它还能够指定要剖析的要领和模块

量变真的会引起质变

在许多人的习惯性逻辑思维里,一个顺序的机能,跟着代码的优化,会是一条腻滑的增进曲线。但实践表明,这个逻辑确切有问题。
经由过程不停对代码的优化,我发明,顺序的机能抵达肯定阶段会发作“突变”,或许“阶跃”。上一次优化的实行时间几百毫秒,下一次优化后的实行时间居然只要几十毫秒,说发作了“阶跃”一点都不夸大。
为何会如许?
至少在我的朋侪圈里,还没有人能给我令人信服的答案,我自认为比较牢靠的明白是,当代操纵系统在cpu指令的处理上,对cpu的任务分配还不是那末“流通”。
哪位朋侪有好的看法,迎接批评指正!

腾讯云双十一活动