Python问世至今已经三十年左右了,但其仅在过去几年人气迅速飙升超过了除java和C以外的其他语言。总的来说,Python已经成为教学、学习编程和软件开发的优秀起点,而且其可以成为任何技术栈中有价值的一部分。
不幸的是,这样的流行程度也会暴露Python的缺点,最显著且众所周知的缺点是这三个:运算性能、打包及可执行程序的生成、项目管理
虽然这三个缺点都不是非常致命,但是和其他处于上升通道的语言如Julia、Nim、Rust和Go相比,Python的劣势将越来越明显。
下面给大家讲讲Python程序员面临的这三个缺点,以及Python与其第三方工具开发人员提出的解决这些缺点的方法。
缺点一:Python 多线程和速度
Python 整体性能缓慢,有限的线程和多处理能力是其未来发展的主要障碍。
Python长期以来一直重视编程的易用性而不是运行时的速度。当通过使用C或C++编写的高速外部库(如Numpy和Numba)在Python中完成如此多的性能密集型任务时,你会发现Python重视编程的易用性也是一种不错的选择。但是尽管如此,Python的开箱即用的性能速度依然落后于其他语言,比如说具有同样简单语法的Nim和Julia,却可以被编译为机器代码,具有更高的性能优势。
Python无法全面利用多核处理器是其长久以来的问题,它确实具有线程功能,但它的线程功能是局限于单个核心的。虽然Python可以使用多进程,但是调度和同步这些子进程的结果并不总是有效的
解决方案
目前没有单一,自上而下的整体解决方案来解决Python的性能问题,不过我们有一系列加速Python的举措。比如说:
使用PyPy解释器替代官方解释器,PyPy能够将Python代码编译成机器代码,它在仅仅使用Python自带的模块的代码中效果最好,不过现在也可以适用于如numpy这样的流行的库,但是其始终只适合于长期运行的服务,而不是能打包带走的应用程序。Cython,Cython能将Python+C混合编码的.pyx脚本转化为C代码。该项目最初是为科学和数值计算而设计的,但它可以在大多数情况下使用。Numba,Numba和Cython类似,主要用于科学计算。Mypyc,是现在仍在开发的项目,它会将用mypyc类型装饰器装饰的代码转化为C.优化的Python发行版,比如英特尔针对特殊的处理器和其特殊的数学运算所开发的专门编译版本。不过尽管它能够显著加快部分运算速度,但不能加快整体的运算速度。如果你是高手,你还能尝试摆脱一下GIL(全局解释器锁),之所以Python的多线程是假的,就是因为GIL的存在:它用来保证Python同时只能有一个线程运行。因此从理论上来讲,如果你摆脱了GIL,就能进行多线程运算,可以提高性能。
还有一个正在进行的项目能够解决许多速度提升的问题,即重构Python内部C接口的实现,一个不混乱的接口可以使得许多性能的改进成为可能。
缺点二:Python 打包和可执行文件
即使在Python诞生30年后,Python依然没有很好的方法来生成可执行文件(exe程序等)
我们只能通过第三方工具解决。而且用起来比较麻烦。
解决方案
pyinstaller 可以打包使用许多如numpy这样的库,但是它必须和这些库保持版本一致,这可太难受了。而且它生成的程序比较大,因为把import语句里所有的内容都封装在一起了。还有种方法也是正在研究中,那就是PyOxidizer项目使用Rust语言生成嵌入Python的二进制文件,不过距离成为真正的解决方案还有一段发展路程要走。缺点三:Python 包管理、项目管理
当你想将一个本地比较复杂的Python工程移植到服务器上的时候,你就知道Python项目管理是有多蛋疼了
你需要不断地安装项目依赖,依赖的依赖可能还有依赖,就像俄罗斯俄罗斯套娃一样,恨不得直接把键盘吃了。
解决方案
这种问题,当然需要Python的开发团队出手了,需要他们提供一套优雅的迁移工具。不过他们已经朝这个方向前进几步了, 根据PEP 518,Python的构建依赖项被合并为pyproject.toml文件格式(取代了setup.py, requirements.txt, setup.cfg, MANIFEST.in 以及最新加入的Pipfile)当然也不是没有办法,使用poetry依赖管理工具,它能够很方便地将你所需要的依赖打包在一起。文章到此就结束啦!如果你看完后觉得有收获,记得点一下在看,让更多小伙伴看到这篇文章吧!如果你有其他的小问题,可以在下方窗口留言哦!
Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典