Python 的 GIL 时代即将终结,迈向真正的多线程时代

python3.14版本多解释器特性初探 有人说Python 3.14的多解释器特性,不是简单的优化,而是并发编程的根本变革。Python3.14引入了多解释器的特性,允许在同一个Python进程中创建多个独立的解释器,每个解释器都有自己的GIL,因此可以真正并行执行。熟悉python的人都知道GIL的存在,GIL导致了python在多线程CPU密集型任务编程,并不能享受现有多核CPU的优势,性能低下。从运行结果可以看到,Python多线程运行CPU密集型任务时,没有体现多核CPU多线程的优势,任务仍然是串行运行。 阅读详情
AI摘要

文章探讨了Python中的全局解释器锁(GIL)及其对性能的影响。GIL限制了Python在多核处理器上的并行性能。如今,Python团队决定将其变为可选,以提升并发能力,但实施过程中会考虑向后兼容性和社区支持,预计整个过程可能需要五年时间。

Python 功能强大、灵活且对程序员友好,广泛应用于从 Web 开发到机器学习的各个领域。根据引用次数最多的两项指标,Python 甚至超越了 Java 和 C 等语言,成为最流行的编程语言。经过多年的流行,Python 似乎势不可挡。

但 Python 作为一种编程语言的未来发展至少面临一个重大障碍。它被称为 GIL,即全局解释器锁,几十年来,Python 开发人员一直试图将其从 Python 的默认实现中删除。

虽然 GIL 在确保线程安全方面发挥着至关重要的作用,但它同时也为多线程程序带来了严重的性能瓶颈。简单来说,GIL 阻碍了 Python 在多核处理器系统上发挥最大效能。很多人认为,如果 Python 想要成为并发编程的首选语言,那么 GIL 必须被废弃。

到目前为止,所有移除 GIL 的尝试都没有成功。但现在,新的一轮努力正在展开,目标是让 GIL 成为历史,让 Python 能够更好地满足未来编程的需求。

全局解释器锁(Global Interpreter Lock,简称 GIL)即将成为历史。这意味着 Python 将摆脱“伪多线程”的标签,迈向真正的并行处理。

“Python 的 GIL 时代即将终结,这对人工智能生态系统是一个巨大的胜利。” PyTorch 的核心维护者 Dmytro Dzhulgakov 激动地表示。

什么是 GIL

那么,GIL 究竟是什么呢?GIL,即全局解释器锁,虽然不是 Python 特有的,但它是在 CPython 解释器的开发过程中引入的一个概念。简单来说,GIL 就像是一个保护机制,确保在任何时刻只有一个线程能够执行 Python 代码,以维护代码的线程安全。

但 GIL 也有它的不足之处:它限制了 Python 在多核 CPU 上的并行处理能力,因为不论有多少个线程,一次只能在一个核心上运行,这大大降低了程序的运行效率。

为什么 Python 有 GIL

严格来说,全局解释器锁并非 Python 语言本身的一部分,而是最常用的 Python 实现版本 CPython 的一个组件,由 Python 软件基金会维护。

GIL 通过限制一次只能有一个线程执行 Python 代码,来确保 CPython 的线程安全。由于 CPython 的内存管理系统本身不支持多线程安全,GIL 便用来控制对对象和内存的访问,防止出现数据竞争。如果没有 GIL,CPython 就必须采用其他方式来处理并发和数据竞争问题。

GIL 为何会成为问题?首先,它阻止了 CPython 解释器实现真正的多线程。这使得 Python 难以实现其他编程语言中常见的代码加速优化。

大多数开发者以各种方式来规避 GIL 的限制。例如,多进程模块允许我们并行运行多个 Python 解释器实例(每个实例在各自的物理线程上),并在它们之间分配任务。但由于在不同 Python 实例间共享数据会产生较大的开销,多进程只适用于某些特定类型的问题。

另一种规避方法是使用 Python 的 C 语言扩展。这些扩展在 Python 解释器之外运行,因此它们处理的数据不受 GIL 的限制。但这种方法只有在处理纯 C 代码和数据结构时才有效,一旦涉及 Python 对象,问题依旧存在。所以,和多进程一样,C 扩展也只能解决一部分问题。

随着 Python 语言的日益流行,GIL 这一缺陷也越来越让人感到尴尬。因此,无论是过去还是现在,都有各种尝试和努力在进行,目的是摆脱 GIL 的束缚。

现在,Python 团队已经正式决定移除 GIL,并将其作为一个可选功能,这对开发者而言无疑是个好消息。

这一变革性的进展是由 Meta 的软件工程师 Sam Gross 在四年多的时间里努力完成的。

消息一出,业界纷纷叫好。深度学习领域的领军人物 Yann LeCun 也发来祝贺:没有了 GIL 的束缚,Python 代码现在可以自由地进行多线程操作了。

告别 GIL 的 Python。

随着 GIL 的退出,Python 的潜力将得到前所未有的释放,预示着一个性能大幅提升的未来。

让我们深入了解一下具体的细节。

CPython 的核心开发者 Thomas Wouters 详细阐述了无 GIL 版本的 Python,并对未来进行了展望。

对于大家就无 GIL 提议提出的宝贵反馈和普遍的积极支持,我们表示衷心的感谢。指导委员会计划采纳这一提议,并在下文中与大家分享更多细节。

我们的基本设想是:

  • 长期来看(大约五年以上),无 GIL 版本的 Python 将成为唯一的选择;
  • 我们非常重视向后兼容性。我们不希望重蹈 Python 3 升级时的覆辙,即所有第三方代码都需要修改以适应无 GIL 版本,而这些修改本应只针对有 GIL 版本(尽管与旧版 Python 的兼容性问题仍然需要解决)。Python 4 版本不会采用这种做法。我们还在考虑关于应用程序二进制接口(ABI)兼容性的要求,以及这两种版本在其他方面的细节,这些都会影响向后兼容性;
  • 在我们决定全面转向无 GIL 之前,我们希望得到社区的支持。我们不能仅仅改变默认设置,我们需要社区的积极参与和支持。我们的核心开发团队需要时间来熟悉新的构建模式,包括 API 设计、打包和分发等方面。我们需要整理现有代码的线程安全问题,并开发新的 C 和 Python 接口。我们还需要将这些见解分享给 Python 社区的其他成员,并确保我们想要做出的改变,以及我们希望他人做出的改变,都是值得追求的;
  • 在我们决定将无 GIL 作为默认设置之前,我们希望能够随时改变主意,如果事实证明这样的改变带来的破坏性太大而收益甚微。这也意味着,在我们将无 GIL 作为标准配置之前,所有与无 GIL 相关的代码都应该是可以识别的,以便回滚。

目前,我们将未来的路线图分为三个阶段:

  • 短期内,我们将在 Python 3.13(可能还有 3.14)版本中,将无 GIL 版本作为一个实验性选项。之所以称之为实验性,是因为我们的核心开发团队虽然支持这一选项,但并不期望整个社区都会立即采用。我们需要时间来探索我们想要如何进行,至少在 API 设计、打包和分发方面,以便获得社区的支持。我们也不建议分销商将实验性的无 GIL 版本作为默认解释器发布。
  • 中期,当我们确信社区的支持足够,使得无 GIL 版本的 Python 可以在生产环境中使用时,我们将支持这一版本,但不会立即作为默认选项。而是在某个特定的日期或 Python 版本中,将其设为默认。具体时间将取决于多种因素,比如 API 变更的兼容性如何,社区还需要完成多少工作等。我们预计这个阶段至少需要一到两年的时间。一旦我们宣布支持,一些分销商可能会开始默认提供无 GIL 版本的 Python。
  • 长期来看,我们希望无 GIL 版本成为新标准,并彻底移除 GIL。我们不想拖延太久,毕竟,同时维护两种常用的构建模式会给社区带来沉重的负担,比如需要双倍的测试资源和调试场景。但我们也不能过于急功近利。我们预计这个过程大约需要五年的时间。

当然,在整个过程中,我们的开发团队将实时评估进展,并根据需要调整时间表。

你对 GIL 将成为可选功能这一变化有何看法?

References

PEP 703 – Making the Global Interpreter Lock Optional in CPython:https://peps.python.org/pep-0703/

A Steering Council notice about PEP 703:https://discuss.python.org/t/a-steering-council-notice-about-pep-703-making-the-global-interpreter-lock-optional-in-cpython/30474

Python 3.14发布:多解释器让性能飙升300%,GIL时代即将终结! Python 3.14革命性升级:多解释器突破GIL限制,性能提升287%。程序员晚枫实测验证,多解释器可实现真正并行计算,使CPU利用率达100%。新技术适用于数据处理、机器学习等场景,但需注意内存开销和兼容性问题。Python 3.14还引入注解延迟求值、模板字符串等特性,为开发者带来全新体验。建议开发环境立即尝鲜,生产环境等待稳定版本。这一变革使Python首次具备与Go、Rust竞争的并发能力。 阅读详情

相关推荐

Python 3.13t 无GIL实战:解锁多核性能新境界

本文深入探讨了Python 3.13t无GIL版本的实战应用,通过性能对比测试,展示了移除全局解释器锁后如何彻底释放多核CPU的计算潜力。文章提供了详细的安装指南、原理分析,并与传统多进程方案进行对比,为开发者处理计算密集型任务提供了新的高性能选择。

weixin_29234509的博客 140

Python3.14:终于摆脱了GIL的限制

虽然 python 3.14(freethreaded)移除了 GIL 这个历史包袱,但很多第三方依赖仍然需要进行适配,短期不建议直接应用于生产环境,期待后续发展。

兴趣使然的创作者 2999

Python并发编程实战:从GIL到线程进程选择,解决程序性能瓶颈

并发编程是现代软件开发中的核心概念,旨在通过同时执行多个任务来提升程序效率。其原理基于操作系统对CPU时间片的调度,允许在单核上快速切换任务(并发)或在多核上同时执行任务(并行)。这项技术的核心价值在于最大化硬件资源利用率,尤其对于需要处理大量I/O操作或计算密集型任务的场景。在Python生态中,全局解释器锁(GIL)是一个关键特性,它限制了多线程的并行执行能力,但也确保了内存管理的线程安全。因此,针对I/O密集型任务,如网络请求或文件读写,推荐使用threading模块或asyncio异步框架,它们能在

weixin_34279579的博客 510

Python3.14发布之后,你必须知道的5大特性!

Python 3.14 预发布版已经发布。这是 Python 社区计划的 7 个版本中的第 3 个 alpha 版本。

m0_75067629的博客 4754

【Python爬虫(32)】从单飞 to 团战:Python多线程爬虫进化史

本文围绕 Python 多线程爬虫展开,先阐述单线程爬虫在爬取大量数据时效率低、无法利用多核资源的困境。接着介绍迈向多线程爬虫的改造之路,包括引入 threading 模块、剖析单线程爬虫代码、多线程爬虫实现步骤及代码示例。然后探讨解决多线程爬虫资源竞争问题的方法,如互斥锁、信号量、队列的运用。通过性能测试对比单线程和多线程爬虫,分析多线程爬虫优势与不足。最后总结多线程爬虫要点,展望其在未来项目中的应用及与其他技术的结合。

邓邓子的博客 1312

华为HCIP大数据备考实战:从题库精析到834分通关策略

本文详细介绍了华为HCIP大数据认证考试的备考策略,包括题库精析、重点章节突破和考场实战经验。作者以834分的高分通过考试,分享了官方教材的三遍阅读法、自建题库技巧以及各章节核心知识点,帮助考生高效备考并顺利通关。

weixin_29169899的博客 149

Python 3.14深度解析:革命性特性与性能优化实践

Python 3.14带来了多项革命性改进:GIL被移除实现真正的自由线程并发,多线程性能提升高达300%;引入延迟类型评估解决循环引用问题;新增模板字符串支持自定义处理;REPL环境和错误定位大幅优化;实验性JIT编译器使数值计算提速20倍;Zstandard压缩算法效率提升3-5倍。这些特性显著提升了Python在并发编程、开发体验和计算性能方面的表现,标志着Python进入高性能编程新时代。

闲人编程的博客 3046

Opencv2.4.9源码分析——HoughCircles

图形可以用一些参数进行表示,标准霍夫变换的原理就是把图像空间转换成参数空间(即霍夫空间),例如霍夫变换的直线检测就是在距离-角度空间内进行检测。圆可以表示成: (x-a)2+(y-b)2=r2                   (1) 其中a和b表示圆心坐标,r表示圆半径,因此霍夫变换的圆检测就是在这三个参数组成的三维空间内进行检测。 原则上,霍夫变换可以检测任何形状。但复杂的形状需要的

赵春江的专栏 3万+

告别GIL桎梏,子解释器如何重塑Python多线程性能?

突破GIL限制,实现高效并发。本文解析Python子解释器多线程优化方案,适用于I/O密集型与混合计算场景,通过隔离内存空间提升并行性能。详解多子解释器协同机制与实际部署技巧,显著增强程序吞吐量,值得收藏。

FuncLens的博客 798

Gazebo仿真UUV水下机器人:从环境搭建到避障算法实战

本文详细介绍了使用Gazebo仿真平台进行UUV水下机器人开发的全流程,涵盖从环境搭建、uuv_simulator配置、传感器集成到核心避障算法实战。通过搭建水下仿真实验室并实现基于激光雷达数据的反应式避障算法,为水下机器人算法验证与开发提供了高效、低成本的解决方案。

weixin_28840591的博客 263

Squareline Studio + LVGL实战:从Figma设计到MCU屏幕的UI开发一条龙(避坑中文显示)

本文详细介绍了使用Squareline Studio和LVGL实现从Figma设计到MCU屏幕UI开发的全流程,重点解决中文显示等常见问题。通过设计工具链搭建、设计稿转换、LVGL工程集成及性能优化等步骤,帮助开发者高效完成嵌入式GUI开发,提升开发效率。

weixin_29246195的博客 583

Python无GIL时代来了:手把手教你配置无锁并发环境的7个关键命令(含避坑清单)

解决Python多线程并发瓶颈,详解Python无锁GIL环境下的并发模型配置步骤详解。适用于CPU密集型任务,基于Tython/PyPy或Rust-Python方案,提升并行效率与资源利用率。含7个关键命令与避坑清单,值得收藏。

AlgoFun的博客 241

Jenkins+docker 微服务实现自动化部署安装和部署过程

本文详细介绍了如何使用Docker部署Jenkins自动化服务器。主要内容包括:1)拉取Jenkins官方或BlueOcean镜像;2)创建容器并配置端口映射、数据卷挂载;3)设置防火墙规则;4)配置清华大学镜像加速;5)安装必要插件;6)SSH密钥配置;7)构建触发器设置;8)编写自动化构建脚本。通过Docker部署Jenkins可以简化安装流程,确保环境一致性,并利用容器特性实现快速启动和管理。文章提供了完整的配置步骤和注意事项,帮助用户快速搭建CI/CD环境。

qq_33665793的博客 1687

Python多线程即将迎来巨变?,一文看懂3.15版本线程模型重构细节

深入解析Python 3.15的线程分析,揭示新版线程模型重构如何提升并发性能。适用于高并发场景,优化GIL机制,增强线程调度效率。开发者可借此掌握新版本核心改进,值得收藏。

InstrFun的博客 906

给新考上北大软件与微电子学院的同学——利用北大资源

利用北大资源 首先,恭喜大家考入北京大学!希望软院成为各位人生旅途中快乐的一站! 说明:限于本人搜集能力有限,本文只列出本人常利用的资源(上课老师会告知的资源也不在此列),本文所述的资源只是北大可利用资源的一个子集。 一、 图书馆资源:北京大学图书馆的资源数量,我就不多废话了,这里主要说一样怎样利用这些资源。 a) 传统资源分布及查找:这种资源主要包括纸质书箱、杂志、光盘等内...

Felomeng的技术博客 1万+

IgH EtherCAT 从入门到精通:第 4 章 网络设备驱动选型与配置

摘要:本章详细介绍了EtherCAT主站网络设备驱动的选型与配置。IgH EtherCAT Master提供Generic通用驱动和Native原生驱动两种方案:Generic驱动通过Linux Socket接口实现,兼容性强但实时性较差;Native驱动通过修改网卡驱动绕过内核协议栈,具有更低延迟和更小抖动。文章具体分析了e1000/e1000e/igb/igc等Intel网卡驱动以及r8169/8139too等Realtek驱动的配置方法,并提供了驱动选型建议。对于实时性要求高的场景,推荐使用Nativ

从事嵌入式linux android驱动开发,拥有全栈能力 304

别再用asyncio硬扛高并发了!无GIL环境下Python原生多线程性能翻倍的6个核心调优参数

破解Python高并发瓶颈!在Python无锁GIL环境下的并发模型生产环境部署中,通过调优6个核心参数(如thread_pool_size、interpreter_isolation等),实现原生多线程性能翻倍。适用于CPU密集型微服务与实时数据处理场景,无需改写业务逻辑。值得收藏

LiteCode的博客 340

YOLO + Qwen3-VL-Seg 深度诊断:双引擎协同完成AI质检

本文提出了一种创新的工业质检双引擎架构,结合YOLO实时检测与Qwen3-VL-Seg精细化诊断,有效解决了传统检测方法中检测与诊断割裂的问题。YOLO部署在边缘端实现高效定位(3.2MB模型,<10ms延迟),Qwen3-VL-Seg在云端完成语义级缺陷分析(仅17M参数的解码器实现像素级分割)。该方案通过6步闭环流程,从实时感知到工艺反哺,显著提升了工业质检的准确性和可解释性,为智能制造提供了从"发现"到"解决"的完整技术路径。

mingo_敏 221

【Python 3.13】新特性解读,重大改进建议升级:JIT编译、免GIL,REPL、错误处理、类型系统等多个方面

Python 3.13带来了许多令人兴奋的新特性和改进,涵盖了REPL、错误处理、并发、性能、类型系统等多个方面。虽然并非所有特性都立竿见影,但它为Python未来的发展指明了方向,也为开发者提供了更强大的工具和更流畅的开发体验。鼓励大家积极尝试Python 3.13,体验其带来的效率飞跃和体验焕新!

Creedassin的博客 3493

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python无GIL时代已来:2024年CPython 3.13+无锁并发实战手册(含性能对比数据)

掌握Python无GIL时代高并发开发方法,详解CPython 3.13+下无锁GIL环境下的并发模型入门到精通教程。覆盖async/await、threading优化、subprocess协同等核心方案,实测性能提升2–5倍。适用于IO密集与轻量计算场景,值得收藏。

SimCompile的博客 249

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

为什么nogil是Python未来的发展方向:深度技术分析

在Python社区中,**nogil**(无全局解释器锁)正成为最热门的技术话题。这个革命性的变革将彻底改变Python的多线程编程体验,让开发者能够真正享受到多核处理器的性能优势。 ## 🔥 Python GIL的历史瓶颈 **全局解释器锁(GIL)** 一直是Python多线程编程的"阿喀琉斯之踵"。这个机制虽然保证了CPython内部状态的线程安全,却严重限制了多核CPU的性能发挥。在

gitblog_01193的博客 361

为什么你的asyncio在多核上只跑出40%利用率?——GIL解除后Python并发模型的5层调度真相

揭秘多核CPU下asyncio低利用率根源,深入Python无锁GIL环境下的并发模型高级开发技巧。覆盖协程调度、事件循环绑定、CPU密集任务卸载、进程池协同及IO/CPU混合负载优化五层机制,显著提升多核吞吐与响应一致性,值得收藏。

ByteChat的博客 351

Python多线程编程实战:从基础到高级应用与性能优化

并发编程是现代软件开发的核心概念,旨在通过同时执行多个任务来提升程序效率。其基本原理在于利用CPU等待I/O操作(如网络请求、文件读写)的时间,切换到其他就绪任务执行,从而最大化资源利用率。这一技术对于构建高响应、高吞吐的应用程序具有重要价值,尤其在Web服务器、数据爬虫、实时监控等I/O密集型场景中效果显著。Python通过标准库的`threading`模块提供了直观的多线程实现,允许创建多个共享内存的执行流。尽管存在全局解释器锁(GIL)对纯CPU密集型任务的并行限制,但通过合理运用线程同步机制(如互斥

weixin_33724570的博客 402

从GIL枷锁到真正的并行:Python 3.15多解释器隔离如何让CPU利用率飙升387%,你还在用multiprocessing?

Python 3.15 多解释器隔离突破GIL限制,实现真正的CPU并行。适用于高并发计算、微服务及IO密集型任务,通过轻量级解释器实例共享内存但隔离状态,显著提升多核利用率。实测CPU使用率飙升387%,远超传统multiprocessing,值得收藏。

Instrustar的博客 277

为什么92%的Python异步服务仍在被GIL拖慢?揭秘2024最新无锁插件链:下载→验证→热加载全流程

破解Python异步服务受GIL拖慢困局,提供无锁GIL环境下的并发模型插件下载与安装全链路方案。支持HTTP/HTTPS安全下载、SHA256自动验证、零停机热加载,适用于高并发API网关与实时数据管道。显著提升CPU密集型任务吞吐量,值得收藏。

CompiLume的博客 421

GIL已死,但你的代码还没活:3步诊断+4类重构模板,让Python服务QPS飙升210%(附可运行压测脚本)

破解Python GIL瓶颈,提升并发性能。本文聚焦Python无锁GIL环境下的并发模型最佳实践,覆盖I/O密集型服务场景,提供3步诊断法与4类重构模板(asyncio/多进程/协程池/外部服务卸载),实测QPS提升210%。附可运行压测脚本,值得收藏。

LogicWander的博客 222
上一篇: LlamaParse:RAG中高效解析复杂PDF的最佳选择
下一篇: RAFT:让大型语言模型更擅长特定领域的 RAG 任务
技术狂潮AI
博客等级 码龄3年 1282粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术狂潮AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值