PythonGIL 中的自由线程模式已禁用)
Python 3.13 最近刚刚发布,具有一个令人惊叹的新功能,称为“自由线程模式”。当您使用线程时,这对于代码的性能来说是一个很大的改进。本文展示了如何启用此功能(默认情况下不启用)并展示“自由线程模式”对代码性能的影响。
安装免费线程Python
Windows 和 MacOS 用户
对于 Windows 和 MacOS 用户,只需从 Python 网站下载最新的安装程序即可。当您安装Python时,当您选择“自定义安装”选项时,会有一个启用“自由线程模式”的复选框。
Ubuntu 用户
对于 Ubuntu 用户,您可以通过在终端中运行以下命令来启用此功能:
sudo add-apt-repository ppa:deadsnakes sudo apt-get update sudo apt-get install python3.13-nogil
验证自由线程模式已启用
安装包后,您可以使用 python3.13(原始)和 python3.13-nogil 或 python3.13t(免费线程 Python)运行代码。
查看这篇文章,了解有关如何在 Linux 发行版上安装 Python 3.13 实验版的更多详细信息。
要验证您的 Python 是否启用了“自由线程模式”,您可以使用以下命令:
python3.13t -VV Python 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0]
自由线程模式性能
实验设置
让我们看看自由线程模式对下面简单代码的影响:
- 我有一个函数工作者,它执行一些计算并返回 0 到 1000 万之间的数字总和。
- 我有“测试 1”来按顺序运行工作函数 5 次。
- 我有“测试 2”来使用多个线程并行运行工作函数,线程数为 5。
- 我确实测量了这两个测试的执行时间。
import sys import threading import time print("Python version : ", sys.version) def worker(): sum = 0 for i in range(10000000): sum += i n_worker = 5 # Single thread start = time.perf_counter() for i in range(n_worker): worker() print("Single Thread: ", time.perf_counter() - start, "seconds") # Multi thread start = time.perf_counter() threads = [] for i in range(n_worker): t = threading.Thread(target=worker) threads.append(t) t.start() for t in threads: t.join() print("Multi Thread: ", time.perf_counter() - start, "seconds")
稍后,我将使用普通 Python(python3.13 二进制文件)和免费线程 Python(pypy3.13t 二进制文件)运行此代码。
结果
首先,使用python3.13运行测试:
python3.13 gil_test.py Python version : 3.13.0 (main, Oct 8 2024, 08:51:28) [GCC 11.4.0] Single Thread: 1.4370562601834536 seconds Multi Thread: 1.3681392602156848 seconds
然后,使用 pypy3.13t 运行测试:
python3.13t gil_test.py Python version : 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0] Single Thread: 1.862126287072897 seconds Multi Thread: 0.3931183419190347 seconds
我也尝试使用 python3.11:
python3.11 gil_test.py Python version : 3.11.3 (main, Apr 25 2023, 16:40:23) [GCC 11.3.0] Single Thread: 1.753435204969719 seconds Multi Thread: 1.457715731114149 seconds
结果分析
Python默认有GIL(Global Interpreter Lock)锁定机制,使得多线程实际上并不是并行的。可以看到单线程的时间处理和多线程类似。
使用python3.11t(自由线程模式),多线程性能比单线程快很多。所以,多线程现在实际上是并行的。
但是,你有没有发现 python3.13t 中的单线程测试比 pypy3.13 慢一点?
我不太明白为什么,所以如果你有任何解释请告诉我。
结论
我认为在python中使用多线程进行并行处理是很好的。但是,如果没有GIL锁定机制,则需要开发人员注意“线程安全”,即。在线程之间共享数据。
此外,我们需要等待库和包更新才能完全支持自由线程模式。这就是为什么现在默认情况下不启用“自由线程模式”的原因之一。但是,我认为这将是未来的一个很好的功能。
以上是PythonGIL 中的自由线程模式已禁用)的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Stock Market GPT
人工智能驱动投资研究,做出更明智的决策

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

运行pipinstall-rrequirements.txt可安装依赖包,建议先创建并激活虚拟环境以避免冲突,确保文件路径正确且pip已更新,必要时使用--no-deps或--user等选项调整安装行为。

本教程详细介绍了如何将PEFT LoRA适配器与基础模型高效合并,生成一个完全独立的模型。文章指出直接使用transformers.AutoModel加载适配器并手动合并权重是错误的,并提供了使用peft库中merge_and_unload方法的正确流程。此外,教程还强调了处理分词器的重要性,并讨论了PEFT版本兼容性问题及解决方案。

Pytest是Python中简单强大的测试工具,安装后按命名规则自动发现测试文件。编写以test_开头的函数进行断言测试,使用@pytest.fixture创建可复用的测试数据,通过pytest.raises验证异常,支持运行指定测试和多种命令行选项,提升测试效率。

本文旨在探讨Python及NumPy中浮点数计算精度不足的常见问题,解释其根源在于标准64位浮点数的表示限制。针对需要更高精度的计算场景,文章将详细介绍并对比mpmath、SymPy和gmpy等高精度数学库的使用方法、特点及适用场景,帮助读者选择合适的工具来解决复杂的精度需求。

theargparsemodulestherecommondedwaywaytohandlecommand-lineargumentsInpython,提供式刺激,typeValidation,helpmessages anderrornhandling; useSudys.argvforsimplecasesRequeRequeRingminimalSetup。

PyPDF2、pdfplumber和FPDF是Python处理PDF的核心库。使用PyPDF2可进行文本提取、合并、拆分及加密,如通过PdfReader读取页面并调用extract_text()获取内容;pdfplumber更适合保留布局的文本提取和表格识别,支持extract_tables()精准抓取表格数据;FPDF(推荐fpdf2)用于生成PDF,通过add_page()、set_font()和cell()构建文档并输出。合并PDF时,PdfWriter的append()方法可集成多个文件

获取当前时间在Python中可通过datetime模块实现,1.使用datetime.now()获取本地当前时间,2.用strftime("%Y-%m-%d%H:%M:%S")格式化输出年月日时分秒,3.通过datetime.now().time()获取仅时间部分,4.推荐使用datetime.now(timezone.utc)获取UTC时间,避免使用已弃用的utcnow(),日常操作以datetime.now()结合格式化字符串即可满足需求。

本教程详细演示了如何利用Python的Pandas库高效地从多个文本文件中提取、关联并整合特定数据。通过将文件数据加载为DataFrame,并使用merge操作进行基于IP地址和MAC地址的内连接,最终实现从不同来源的文件中精确匹配并输出IP、MAC地址及对应端口的关联信息。
