Python 运行速度慢原因之一一GIL(全局解释器锁)可视化

GIL与Python性能

因为它是GIL(全局解释器锁)

现代计算机的 CPU 有多个核心,有时甚至有多个处理器。为了利用所有计算能力,操作系统定义了一个底层结构,叫做线程,而一个进程(例如 Chrome浏览器)能够生成多个线程,通过线程来执行系统指令。这样如果一个进程是要使用很多 CPU,那么计算负载就会由多个核心分担,最终使得绝大多数应用能更快地完成任务。

在撰写本文时,我的 Chrome 浏览器开了 44 个线程。另外,基于 POSIX 的操作系统(如 Mac OS 和 Linux)的线程结构和 API 与 Windows 操作系统是不一样的。操作系统还负责线程的调度。

如果你没写过多线程程序,那么你应该了解一下锁的概念。与单线程进程不同,在多线程编程中,你要确保改变内存中的变量时,多个线程不会试图同时修改或访问同一个内存地址。

CPython 在创建变量时会分配内存,然后用一个计数器计算对该变量的引用的次数。这个概念叫做“引用计数”。如果引用的数目为 0,那就可以将这个变量从系统中释放掉。这样,创建“临时”变量(如在 for 循环的上下文环境中)不会耗光应用程序的内存。

随之而来的问题就是,如果变量在多个线程中共享,CPython 需要对引用计数器加锁。有一个“全局解释器锁”会谨慎地控制线程的执行。不管有多少个线程,解释器一次只能执行一个操作。

Python GIL可视化

在这些图中,Python解释器刻度沿X轴显示。两个条表示正在执行的两个不同的线程。白色区域表示线程完全空闲的时间。绿色区域表示线程何时保持GIL并且正在运行。红色区域指示操作系统何时调度线程仅唤醒并发现GIL不可用(例如,臭名昭着的“GIL战斗”)。对于那些不想阅读的人来说,这里是图片中的传奇:

 


### 优势比较 #### Java - **性能与稳定性**:Java是种编译型语言,其代码会被编译成字节码,然后在Java虚拟机(JVM)上运行。这种方式使得Java程序在运行时具有较高的性能和稳定性,适合处理大规模的数据和复杂的计算任务。在水质分析运行平台中,如果需要对大量的水质数据进行实时处理和分析,Java能够提供高效的计算能力。例如,对水质监测站实时上传的海量数据进行快速分析和处理。 ```java import java.util.ArrayList; import java.util.List; public class WaterQualityAnalysis { public static double calculateAverage(List<Double> data) { double sum = 0; for (double value : data) { sum += value; } return sum / data.size(); } public static void main(String[] args) { List<Double> waterQualityData = new ArrayList<>(); waterQualityData.add(10.0); waterQualityData.add(20.0); waterQualityData.add(30.0); double average = calculateAverage(waterQualityData); System.out.println("Average water quality value: " + average); } } ``` - **安全性**:Java具有强大的安全机制,如沙箱模型、访问控制等。在水质分析运行平台中,涉及到敏感的水质数据和用户信息,Java的安全特性可以有效保护数据的安全性和完整性,防止数据泄露和恶意攻击。 - **企业级开发支持**:Java拥有丰富的企业级开发框架,如Spring、Spring Boot、MyBatis等。这些框架可以帮助开发者快速搭建稳定、可扩展的水质分析运行平台,提高开发效率和代码质量。 #### Python - **简洁易读的语法**:Python的语法简洁明了,代码可读性高,开发效率高。开发者可以用较少的代码实现复杂的功能,缩短开发周期。例如,使用Python进行水质数据的简单分析和可视化。 ```python import numpy as np import matplotlib.pyplot as plt # 模拟水质数据 water_quality_data = np.array([10, 20, 30, 40, 50]) # 计算平均值 average = np.mean(water_quality_data) print(f"Average water quality value: {average}") # 可视化数据 plt.plot(water_quality_data) plt.xlabel('Sample Number') plt.ylabel('Water Quality Value') plt.title('Water Quality Analysis') plt.show() ``` - **丰富的科学计算库**:Python拥有众多强大的科学计算库,如NumPy、Pandas、SciPy等,这些库提供了丰富的函数和工具,方便进行水质数据的处理、分析和建模。此外,还有Matplotlib、Seaborn等可视化库,可以将水质分析结果直观地展示出来。 - **机器学习和深度学习支持**:Python在机器学习和深度学习领域具有广泛的应用,如Scikit - learn、TensorFlow、PyTorch等库。在水质分析运行平台中,可以利用这些库构建预测模型,对水质状况进行预测和预警。 ### 劣势比较 #### Java - **开发周期长**:Java的语法相对复杂,代码量较大,开发过程中需要编写较多的样板代码。这导致开发周期相对较长,尤其是在快速迭代开发的项目中,可能会影响项目的进度。 - **学习成本高**:Java的学习曲线较陡,对于初学者来说,需要掌握面向对象编程、JVM原理、各种框架等知识,学习成本较高。 #### Python - **性能问题**:Python种解释型语言,其运行速度相对较慢。在处理大规模数据和复杂计算任务时,性能可能不如Java。例如,对大规模的水质历史数据进行复杂的统计分析时,Python的处理速度可能会成为瓶颈。 - **多线程处理能力有限**:Python全局解释器锁GIL)限制了多线程的并发执行能力,在需要进行多线程并行计算的场景下,Python的表现不如Java。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值