关于python语言优化的一些思考
最近一直在做python工程化相关的工作,颇有心得,遂总结一下。
一是为了整理思绪,二是为了解放自己健忘的大脑。
python是一个C的语法糖盒子
原生的python通常都是由cpython实现,而cpython的运行效率,确实让人不敢恭维,比较好的解决方案有cython、numba、pypy等等
cython
是目前我认为发展最好,最靠谱的一项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
所以,采取什么数据结构要看应用场景,没有万能的高效数据结构
不要以为排除法是万能的
优化代码的过程中,因为我的以往成功“经验”,也导致走了不少弯路,最主要的,就是盲目使用排除法。使用排除法只能使用二分查找或快排的策略去组织代码,如果目标代码比较少还可以,事实上,在真实场景中往往有成百上千行目标代码。人工执行和实现O(logN)量级的操作,似乎是一种蛮干。
这里有几个度量工具顺便记录下:
py_spy
https://github.com/benfred/py-spy
方便的生成CPU执行方法的火焰图
line_profiler
https://github.com/rkern/line_profiler
逐行代码分析,不要小看它的能力,它还可以指定要分析的方法和模块
量变真的会引起质变
在很多人的习惯性逻辑思维里,一个程序的性能,随着代码的优化,会是一条平滑的增长曲线。但实践表明,这个逻辑确实有问题。
通过不断对代码的优化,我发现,程序的性能到达一定阶段会发生“突变”,或者“阶跃”。上一次优化的执行时间几百毫秒,下一次优化后的执行时间竟然只有几十毫秒,说发生了“阶跃”一点都不夸张。
为什么会这样?
至少在我的朋友圈里,还没有人能给我令人信服的答案,我自认为比较可靠的理解是,现代操作系统在cpu指令的处理上,对cpu的任务分配还不是那么“流畅”。
哪位朋友有好的见解,欢迎批评指正!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
学会选择最适合自己的GPS定位系统源码
源码大家都知道就是可以用来做二次开发做任何改动的代码,一般购买源码都是考虑到后期会做二次开发有增加修改功能模块等需求,没有源码是无法实现的。 GPS定位系统源码有很多种,这里说的很多种是指不同用途的GPS定位系统源码;包含的功能,模块,开发语言,开发框架,系统架构等等的不同都会导致GPS定位系统的源码出现很大的区别! 如果用来做二次开发的源代码一定要选择通用性,前后端分离,灵活架构,模块耦合性更灵活的结构!否则开发过程中会发现修改一处地方的代码,你甚至可能要动整个页面,有的后端都要改动,可想而知这样结构的代码要做二开该是多么的恐怖,付出的工作量将是极其巨大的! GPSBD是一套专为二次开发而设计的GPS定位系统源代码;GPSBD系统从一开始设计就考虑到二次开发过程中可能遇到的各种情况,避免开发者走弯路,重复造轮子的情况出现;所以GPSBD系统一开始就采用前后端分离架构,模块的通用性,多人同时开发互不影响,模块之间的耦合性;这些都是贯穿GPSBD整套系统的设计理念,就是为了帮助开发者可以更快速的,更方便的去做不同业务层不同行业的位置应用! GPSBD系统还拥有丰富的后台权限配置体系,角色...
- 下一篇
Java学习笔记——dubbo服务之底层通讯协议Protocol
我们先来找到通讯协议的入口点吧。通过Protocol接口查找通讯协议入口点,我们根据接口的export方法搜索发现入口了,在ServiceConfig的doExportUrlsFor1Protocol方法,如下图: 然后我们进入 protocol.export(invoker)方法发现有很多实现类,根据spi(不懂的请看之前写的容器篇)查看配置文件能找到如下 registry=com.alibaba.dubbo.registry.integration.RegistryProtocol dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol//这个是默认的,我们在Protocol接口上可以看到spi的注解 filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper listener=com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper mock=com.alibaba.dubbo.rpc.support.MockP...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器