首页 / 知识
Python 多线程与速度
2023-11-12 13:39:00
问题:Python的总体性能较慢,有限的线程与孱弱的多处理能力成为其未来发展的主要障碍。
Python长期以来一直更重视编程速度,而非运行速度。考虑到很多开发者习惯于利用C或C++编写高速外部库(例如NumPy或者Numba)以执行Python下的性能密集型任务,这样的权衡似乎也没什么大不了。但问题在于,Python的开箱性能仍然落后于其它语法同样简单、但能够编译为机器码的语言,例如Nim或者Julia。
Python当中历史最悠久的性能问题之一,在于其对多核心或处理器的资源使用能力不佳。虽然Python确实具有线程功能,但却仅限于单一核心。此外,Python也会尝试通过启动其运行时的子实例以支持多处理,但是针对这些子进程结果的调度与同步往往效率不高。
解决方案:目前,还没有某一种自上而下的整体性解决方案,能够直接搞定Python的性能问题。不过,现在已经出现了一系列用于加速Python的尝试,其各自都在特定领域做出了一定改进。
下面来看例子:
改善CPython的内部行为。CPython改进带来了幅度有限但却覆盖面广泛的加速效果。例如,Python3.8的Vectorcall协议为Python对象带来了更快的调用约定。虽然改进效果不算显著,但足以带来具有可测量且可预测的性能提升,而且完全不会破坏向下兼容性;此外,现有Python应用程序可直接受益,无需任何代码重写。
改进CPython的子解释器功能。Python解释器实例的新编程接口现在可以时在各解释器之间实现优雅的数据共享,从而实现多核处理。现在,这项提案已经确定将在Python3.9中面世,相信其还将在后续版本中继续发挥重要作用。
改进多个进程之间的对象共享。Python当中的多处理机制会为每个核心启动一个新的解释器实例,用以获取最佳性能;但当多个解释器尝试对同一内存对象进行操作时,大部分性能提升都会瞬间作废。目前,以SahredMemory类以及新的pickle协议为代表的新功能,可以减少解释器之间数据传递所需要的复制或者序列化过程,从根本上消除相关性能问题。
在Python之外,也有不少外部项目带来了新的性能提升方法——但同样仅限于特定问题:
PyPy。另一种Python解释器,PyPy能够将Python即时编译为本机机器码。它在纯Python项目当中发挥出色,现在也能很好地兼容比较流行的二进制相关库——例如NumPy。但其一般更适合长期运行的服务,而非一次性应用程序。
Cython。Cython允许用户逐步将Python代码转换为C代码。该项目最初是专为科学与数值计算所设计的,但却能够在大多数场景下起效。Cython最大的缺点在于语法,其使用了独有的语法设置,且转换只能单向进行。Cython最适合处理“热点”部分代码,这种有针对性的优化方式往往比应用程序整体优化要更合理、也更可行。
Numba。Numba的即时编译功能可以面向选定功能将Python代码编译为机器码。与Cython类似,Numba同样主要用于科学计算,其比较适合就地运行而非对代码进行重新发布。
Mypyc。Mypyc项目目前仍在开发当中,其希望将带有mypy类型注释的Python代码转换为C代码。Mypyc很有前途,因为其使用到Python中的众多原生类型,但目前距离生产应用还有很长的路要走。
经过优化的Python发行版。某些第三方Python版本(例如英特尔的Python发行版)拥有可充分发挥英特尔处理器扩展(例如AVX512)优势的数学与统计库。需要注意的是,尽管其能够显著加快特定数学函数的执行速度,但却无法实现全面的速度提升。
有经验的Python程序员一定还会提到全局解释器锁(GIL)的问题,其负责对指向对象的访问进行序列化,以确保不同线程不会彼此影响到对方的工作负载。从理论上讲,放弃GIL可以提高性能。然而,无GILPython基本上丧失了向下兼容能力(特别是在PythonC扩展方面)。因此到目前为止,所有移除GIL的尝试要么已经走进死胡同,要么反而降低了Python的性能。
目前另一个正在推进的Python计划有望解决不少速度方面的问题,即重构Python内部的CAPI实现。众长远来看,提升API集的有序程度可以带来诸多性能改进:重新设计或者剔除GIL、提供可实现强大即时编译的hook、在解释器实例之间使用更好的数据联合方法等等。
以上内容为大家介绍了Python多线程与速度,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
linux网络服务命令?
linux网络服务命令?,系统,地址,网络,基础,设备,信息,服务,工作,名称,标准,配置LINUX的IP命令通过配置文件配置LINUX的IP命令:vim /etc/sysconfilinux命令行连数据库?
linux命令行连数据库?,地址,服务,信息,名字,数据库,密码,网络,一致,软件,系统,linux怎么连接mongodb数据库1、在这里使用的是MongoVUE进行连接linux命令代码怎么看?
linux命令代码怎么看?,时间,系统,代码,命令,状态,工具,情况,电脑,实时,基础,linux查看系统命令是什么有的,Linux中有多个命令可以用于查看文件linux重启服务端命令?
linux重启服务端命令?,标准,设备,工作,系统,网络,名称,命令,信息,服务,网络服务,linux重启网络服务命令是什么(linux网络重启的命令)1、输入 slinux启动服务命令?
linux启动服务命令?,服务,系统,信息,命令,文件,下面,问题,方式,脚本,级别,linux重启的命令1、linux重启命令有五个,分别如下:shutdown。poweroff怎么把数据库导入navicat?
怎么把数据库导入navicat?,软件,信息,密码,管理,数据库,服务,电脑,按钮,类型,文件,Navicat是一个强大的数据库管理工具,它可以连接和管理多种数比较好用的Python代码编辑器
比较好用的Python代码编辑器,代码,平台,环境,培训,教育,设计,数据,办公,人员,分析,Python是一款非常简单的编程语言,其功能使用起来都十分方便pycharm无法输入代码?
pycharm无法输入代码?,代码,环境,工具,分析,输入法,键盘,性能,计算机,问题,版本,PyCharm是一款Python语言开发的集成开发环境(IDE),它是许多Pytho快速构建Python爬虫IP代理池服务
快速构建Python爬虫IP代理池服务,代理,代码,网站,服务,检测,最新,公司,爬虫,质量,时间,在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为python代码的规范建议
python代码的规范建议,代码,异常,二元,设计,数字,下降,一致,培训,标准,空行,1.一致性的建议打破一条既定规则的两个好理由当应用这个规则将导Python数据分析有哪些重要的库?
Python数据分析有哪些重要的库?,数据,分析,标准,庞大,通用,平台,培训,工具,基础,灵活,众所周知,有很多编程语言都可以应用于数据分析领域,但PythPython数据分析相关的技术
Python数据分析相关的技术,数据,工具,化学,设计,分析,网络,软件,系统,工程,商业,1.机器学习和计算机视觉Crab:灵活、快速的推荐引擎gensim:人性