当前位置: 首页 > article >正文

使用Cython中prange函数实现for循环的并行

上一篇文章我们探讨了 GIL 的原理以及如何释放 GIL 实现并行做法是将函数声明为 nogil然后使用 with nogil 上下文管理器即可。在使用上非常简单但如果我们想让循环也能够并行执行那么该方式就不太方便了为此 Cython 提供了一个 prange 函数专门用于循环的并行执行。这个 prange 的特殊功能是 Cython 独一无二的并且 prange 只能与 for 循环搭配使用不能独立存在。Cython 使用 OpenMP API 实现 prange用于多平台共享内存的处理。但 OpenMP 需要 C 或者 C 编译器支持并且编译时需要指定特定的编译参数来启动。例如当我们使用 gcc 时必须在编译和链接二进制文件的时候指定一个 -fopenmp以确保启用 OpenMP。许多编译器均支持 OpenMP 包括免费的和商业的。但 Clang/LLVM 则是一个最显著的例外它只在一个单独的分支中得到了初步的支持而为它完全实现的 OpenMP 还在开发当中。而使用 prange需要从 cython.parallel 中进行导入。但是在这之前我们先来看一个例子123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657importnumpy as npfromcython cimport boundscheck, wraparoundcdef inline double norm2(doublecomplexz) nogil:接收一个复数 z, 计算它的模的平方由于 norm2 要被下面的 escape 函数多次调用这里通过 inline 声明成内联函数:param z::return:returnz.real*z.realz.imag*z.imagcdefintescape(doublecomplexz,doublecomplexc,double z_max,intn_max) nogil:这个函数具体做什么, 不是我们的重点我们不需要关心cdef:inti0double z_max2z_max*z_maxwhilenorm2(z) z_max2andi n_max:zz*zci1returniboundscheck(False)wraparound(False)defcalc_julia(intresolution,doublecomplexc,double bound1.5,double z_max4.0,intn_max1000):我们将要在 Python 中调用的函数cdef:double step2.0*bound/resolutioninti, jdoublecomplexzdouble real, imagint[:, ::1] countscountsnp.zeros((resolution1, resolution1), dtypeint32)foriinrange(resolution1):real-boundi*stepforjinrange(resolution1):imag-boundj*stepzrealimag*1jcounts[i, j]escape(z, c, z_max, n_max)returnnp.array(counts, copyFalse)我们手动编译一下然后调用 calc_julia 函数这个函数做什么不需要关心我们只需要将注意力放在那两层 for 循环准确的说是外层循环上即可这里我们采用手动编译的形式。123456importcython_testimportnumpy as npimportmatplotlib.pyplot as pltarrcython_test.calc_julia(1000,0.3220.05j)plt.imshow(np.log(arr))plt.show()那么 calc_julia 这个函数耗时多少呢我们来测试一下使用 prange对于上面的代码来说外层循环里面的逻辑是彼此独立的即当前循环不依赖上一层循环的结果因此这非常适合并行执行。所以 prange 便闪亮登场了我们只需要做简单的修改即可1234567891011121314151617181920212223242526272829303132333435363738394041424344importnumpy as npfromcython cimport boundscheck, wraparoundfromcython.parallel cimport prangecdef inline double norm2(doublecomplexz) nogil:returnz.real*z.realz.imag*z.imagcdefintescape(doublecomplexz,doublecomplexc,double z_max,intn_max) nogil:cdef:inti0double z_max2z_max*z_maxwhilenorm2(z) z_max2andi n_max:zz*zci1returniboundscheck(False)wraparound(False)defcalc_julia(intresolution,doublecomplexc,double bound1.5,double z_max4.0,intn_max1000):cdef:double step2.0*bound/resolutioninti, jdoublecomplexzdouble real, imagint[:, ::1] countscountsnp.zeros((resolution1, resolution1), dtypeint32)# 只需要将外层的 range 换成 prangeforiinprange(resolution1, nogilTrue):real-boundi*stepforjinrange(resolution1):imag-boundj*stepzrealimag*1jcounts[i, j]escape(z, c, z_max, n_max)returnnp.array(counts, copyFalse)我们只需要将外层循环的 range 换成 prange 即可里面指定 nogilTrue便可实现并行的效果至于这个函数的其它参数以及用法后面会说。而且一旦使用了 prange那么在编译的时候必须启用 OpenMP下面看一下编译脚本。123456789fromdistutils.coreimportsetup, ExtensionfromCython.Buildimportcythonizeext[Extension(cython_test,sources[cython_test.pyx],extra_compile_args[-fopenmp],extra_link_args[-fopenmp])]setup(ext_modulescythonize(ext, language_level3))编译测试一下我们看到效率大概是提升了两倍因为我 Windows 上使用的不是 gcc所以这里是在 CentOS 上演示的。而我的 CentOS 服务器只有两个核因此效率提升大概两倍左右。所以只是做了一些非常简单的修改便可带来如此巨大的性能提升简直妙啊。prange 是要搭配 for 循环来使用的如果 for 循环内部的逻辑彼此独立即第二层循环不依赖第一层循环的某些结果那么不妨使用 prange 吧。注意还没完我们还能做得更好下面就来看看 prange 里面的其它的参数这样我们能更好利用 prange 的并行特性。prange 的其它参数prange 函数的原型如下123456789# 第一个参数 self 我们不需要管# prange 实际上是类 CythonDotParallel 的成员函数# 因为 Cython 内部执行了下面这行逻辑# sys.modules[cython.parallel] CythonDotParallel()# 所以它将一个实例对象变成了一个模块defprange(self, start0, stopNone, step1,nogilFalse, scheduleNone,chunksizeNone, num_threadsNone):我们先来看前三个参数start、stop、step。prange(3): 相当于 start0、stop3prange(1, 3): 相当于 start1、stop3prange(1, 3, 2): 相当于 start1、stop3、step2类似于 range同样不包含结尾 stop。然后是第四个参数 nogil它默认是 False但事实上我们必须将其设置为 True否则会报出编译错误。然后剩下的三个参数如果我们不指定的话那么 Cython 编译器采取的策略是将整个循环分成多个大小相同的连续块然后给每一个可用线程一个块。然而这个策略实际上并不是最好的因为每一层循环用的时间不一定一样如果一个线程很快就完成了那么不就造成资源上的浪费了吗我们修改一下将 schedule 指定为 staticchunksize 指定为 112foriinprange(resolution1, nogilTrue,schedulestatic, chunksize1):其它地方不变只是加两个参数然后重新测试一下。我们看到效率上是差不多的原因是我的机器只有两个核如果核数再多一些的话那么速度就会明显地提升。下面来解释一下剩余的三个参数的含义首先是 schedule它有以下几个选项static整个循环在编译时会以一种固定的方式分配给多个线程如果 chunksize 没有指定那么会分成 num_threads 个连续块一个线程一个块。如果指定了 chunksize那么每一块会以轮询调度算法Round Robin交给线程进行处理适用于任务均匀分布的情况。dynamic线程在运行时动态地向调度器申请下一个块chunksize 默认为 1当任务负载不均时动态调度是最佳的选择。guided块是动态分布的就像 dynamic 一样但这与 dynamic 还不同chunksize 的比例不是固定的而是和 剩余迭代次数 / 线程数 成比例关系。runtime不常用。控制 schedule 和 chunksize 可以方便地探索不同的并行执行策略、以及工作负载分配通常指定 schedule 为 static加上设置一个合适的 chunksize 是最好的选择。而 dynamic 和 guided 适用于动态变化的执行上下文但会导致运行时开销。当然还有最后一个参数 num_threads很明显不需要解释就是使用的线程数量。如果不指定那么 prange 会使用尽可能多的线程。所以我们只是做了一点修改便可以带来巨大的性能提升这种性能提升与 Cython 在纯 Python 上带来的性能提升成倍增关系。

相关文章:

使用Cython中prange函数实现for循环的并行

上一篇文章我们探讨了 GIL 的原理,以及如何释放 GIL 实现并行,做法是将函数声明为 nogil,然后使用 with nogil 上下文管理器即可。在使用上非常简单,但如果我们想让循环也能够并行执行,那么该方式就不太方便了&#xf…...

3大核心模块掌握IPATool:从iOS应用搜索到IPA下载的完整指南

3大核心模块掌握IPATool:从iOS应用搜索到IPA下载的完整指南 【免费下载链接】ipatool Command-line tool that allows searching and downloading app packages (known as ipa files) from the iOS App Store 项目地址: https://gitcode.com/GitHub_Trending/ip/i…...

开发者内功修炼指南:从代码实践到架构设计的核心技能

1. 项目概述:一份写给开发者的“内功心法”在技术社区里,我们常常看到各种炫酷的新框架、新工具,它们像一把把锋利的“神兵利器”,让人眼花缭乱。然而,一个老生常谈却又无比真实的问题是:给你倚天剑&#x…...

BetterNCM Installer深度解析:5个核心技巧助你打造个性化网易云音乐体验

BetterNCM Installer深度解析:5个核心技巧助你打造个性化网易云音乐体验 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否曾经在使用网易云音乐时,觉得某些…...

深度解析WenQuanYi Micro Hei:轻量级开源中文字体架构设计与性能优化指南

深度解析WenQuanYi Micro Hei:轻量级开源中文字体架构设计与性能优化指南 【免费下载链接】fonts-wqy-microhei Debian package for WenQuanYi Micro Hei (mirror of https://anonscm.debian.org/git/pkg-fonts/fonts-wqy-microhei.git) 项目地址: https://gitcod…...

开源笔记应用yn:基于Markdown的沉浸式写作与知识管理方案

1. 项目概述:一个为创作者而生的“数字书房” 如果你和我一样,每天需要在不同设备、不同场景下处理大量的文字工作——可能是写代码时的零散笔记,可能是撰写技术博客的草稿,也可能是整理项目文档的片段——那么你肯定对市面上那些…...

LightGBM核心原理与工业级应用实战指南

1. 初识LightGBM:当GBDT遇见效率革命第一次接触LightGBM是在处理一个包含数百万条记录的电商用户行为数据集时。当时我正苦于XGBoost的训练速度无法满足迭代需求,直到发现了这个微软开源的梯度提升框架。与传统GBDT(Gradient Boosting Decisi…...

从LlamaDeploy到Llama-Agents:智能体工作流生产级部署实战指南

1. 项目概述:从原型到生产,LlamaDeploy的使命与演进如果你和我一样,在过去一年里深度折腾过基于大语言模型(LLM)的智能体应用,那你肯定经历过这个阶段:在Jupyter Notebook里,用几行代…...

边缘资源“幽灵占用”正在吞噬你的SLO!MCP 2026 v2.4.0新增Resource Shadow Detection功能全解

更多请点击: https://intelliparadigm.com 第一章:边缘资源“幽灵占用”问题的本质与SLO影响 边缘计算环境中,“幽灵占用”指资源(如 CPU、内存、GPU 或网络端口)被进程或容器长期持有却未实际执行有效负载&#xff0…...

【信创合规红线预警】:MCP 2026新增3项硬件可信启动要求——飞腾D2000/鲲鹏920/海光Hygon C86平台适配避坑清单(含UEFI Secure Boot签名密钥迁移路径)

更多请点击: https://intelliparadigm.com 第一章:MCP 2026可信启动新规的合规背景与战略意义 随着全球关键信息基础设施安全治理持续深化,MCP(Multi-layered Chain-of-Trust Protocol)2026可信启动新规正式纳入《国家…...

【2024最硬核VS Code自动化教程】:覆盖GitHub Actions+Dev Containers+Task Runner的Copilot Next三重协同配置

更多请点击: https://intelliparadigm.com 第一章:VS Code Copilot Next 自动化工作流配置全景概览 VS Code Copilot Next 并非独立插件,而是基于 GitHub Copilot Chat 的深度集成增强形态,依托 VS Code 1.86 的新扩展主机 API …...

Hunyuan-MT-7B开源镜像部署:Pixel Language Portal灰度发布策略详解

Hunyuan-MT-7B开源镜像部署:Pixel Language Portal灰度发布策略详解 1. 项目概述 Pixel Language Portal(像素语言跨维传送门)是一款基于Tencent Hunyuan-MT-7B核心引擎构建的创新翻译工具。该产品通过独特的16-bit像素冒险界面设计&#x…...

显卡驱动残留问题终极解决方案:Display Driver Uninstaller深度使用指南

显卡驱动残留问题终极解决方案:Display Driver Uninstaller深度使用指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-dri…...

3分钟解锁PDF宝藏:Python pdftotext终极文本提取指南

3分钟解锁PDF宝藏:Python pdftotext终极文本提取指南 【免费下载链接】pdftotext Simple PDF text extraction 项目地址: https://gitcode.com/gh_mirrors/pd/pdftotext 在日常办公和数据处理中,PDF文档就像一座座信息宝库,但如何快速…...

DeepSeek V4 正式发布:1.6万亿参数、百万上下文,开源大模型进入新阶段

DeepSeek V4 正式发布:1.6万亿参数、百万上下文,开源大模型进入新阶段 2026年4月24日,深度求索(DeepSeek)正式发布了新一代旗舰模型 DeepSeek-V4,并同步开源模型权重。这是距 V3 发布484天之后的一次重大版…...

Agent 项目如何写 PRD:任务边界、风险清单与验收口径

Agent 项目如何写 PRD:任务边界、风险清单与验收口径 1. 引入:90%的Agent项目失败,都始于一份不合格的PRD 2024年某AI咨询公司发布的《企业Agent落地调研报告》显示:全年国内企业上马的Agent类项目中,72%最终未能落地,其中48%的失败原因可以归结为「需求定义模糊」——…...

框架篇第3节:PyTorch C++扩展(一)——环境搭建与一个简单的add算子

引言 当PyTorch内置算子不够用时,你可以用C++和CUDA扩展它——这是通往高性能自定义算子的必经之路 前两节我们学习了PyTorch的GPU加速原理和算子底层机制。但实际开发中,你可能会遇到PyTorch没有提供的高效算子,或者需要融合多个操作以减少内存访问。这时,你就需要自定义算…...

深入Rockchip Android分区表:揭秘‘logo分区’的创建与定制化配置

Rockchip Android分区表深度解析:logo分区的定制化设计与工程实践 在工业自动化设备、数字标牌和定制化终端领域,开机第一屏的品牌标识展示往往承载着重要的商业价值和技术内涵。不同于消费级设备千篇一律的厂商Logo,专业设备通常需要根据应用…...

告别硬件IIC:STM32F103用软件模拟IIC读写AT24C02/04/16全攻略(含地址计算详解)

STM32软件模拟IIC驱动AT24C系列EEPROM实战指南 1. 为什么选择软件模拟IIC? 在嵌入式开发中,IIC总线因其简单的两线制(SDA和SCL)和灵活的多设备连接特性,成为连接各类传感器的首选方案。然而,STM32的硬件IIC…...

Phi-4-mini-flash-reasoning多场景:从单题求解到批量PRD分析的扩展路径

Phi-4-mini-flash-reasoning多场景:从单题求解到批量PRD分析的扩展路径 1. 轻量级推理模型的核心价值 Phi-4-mini-flash-reasoning是一款专为结构化思维任务设计的轻量级文本推理模型。与通用大模型不同,它在数学推导、逻辑分析和长文本推理等场景展现…...

06华夏之光永存:电磁弹射+一次性火箭航天入轨方案【第六篇:电磁弹射核心电池组参数与供配电优化方案】

华夏之光永存:电磁弹射一次性火箭航天入轨方案【第六篇:电磁弹射核心电池组参数与供配电优化方案】核心备注:本文为该系列第六篇核心电池组供配电篇,系列共计10篇保姆式开源落地白皮书,全文基于大功率储能电化学、电力…...

完整网页截图终极指南:如何一键保存超长网页的完美副本

完整网页截图终极指南:如何一键保存超长网页的完美副本 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-exte…...

网络受限环境下的OOTDiffusion虚拟试衣AI完整部署实战指南

网络受限环境下的OOTDiffusion虚拟试衣AI完整部署实战指南 【免费下载链接】OOTDiffusion [AAAI 2025] Official implementation of "OOTDiffusion: Outfitting Fusion based Latent Diffusion for Controllable Virtual Try-on" 项目地址: https://gitcode.com/Gi…...

五大免费大语言模型(LLM)课程推荐与学习指南

1. 大语言模型(LLMs)学习资源概览过去两年,大语言模型(LLMs)的发展速度令人咋舌。从最初的文本补全到现在的多模态交互,这些模型正在重塑我们与数字世界的互动方式。作为一名长期跟踪AI技术发展的从业者&am…...

机器学习中矩阵类型与应用实践指南

1. 矩阵类型在机器学习线性代数中的核心价值第一次接触机器学习时,我被各种矩阵运算绕得头晕眼花,直到发现不同类型的矩阵其实对应着特定的数学特性和应用场景。就像木匠需要了解不同木材的特性才能打造好家具,理解矩阵类型能让我们更高效地构…...

机器学习k折交叉验证:k值选择与性能评估指南

1. 机器学习中的k折交叉验证配置指南在机器学习实践中,评估模型性能是项目流程中的关键环节。k折交叉验证(k-Fold Cross-Validation)作为最常用的评估技术之一,其核心思想是将数据集划分为k个大小相似的互斥子集,每次用…...

MCP 2026多租户隔离配置全链路解析,从vCPU亲和性到TLS 1.3租户证书绑定,覆盖7层隔离面

更多请点击: https://intelliparadigm.com 第一章:MCP 2026多租户隔离架构全景概览 MCP 2026(Multi-Tenant Control Plane 2026)是新一代云原生控制平面标准,专为超大规模混合云环境设计。其核心设计理念是“零信任边…...

【2026年AI DevOps分水岭】:Docker AI Toolkit全新Agent编排框架上线,支持AutoGen/MetaGPT原生集成——现在不装,下周CI/CD流水线将自动拒绝旧版镜像

更多请点击: https://intelliparadigm.com 第一章:Docker AI Toolkit 2026 最新版功能 Docker AI Toolkit 2026 是面向 AI 工程化部署的下一代容器化工具链,深度集成模型编译、量化推理、分布式训练监控与合规性审计能力。相比 2025 版本&a…...

全网最全的医药数据库挖掘教学专栏,只需要399元,不断更新,欢迎订阅!

当前的医药数据科学和R语言领域,网络上和书籍市面上一大堆资料,表面看起来琳琅满目,价格从几十元的书籍到动辄几千元一次的线下培训班都有。但绝大多数培训或书籍都受限于时间和篇幅,浅尝辄止,很多仅仅是基础入门&…...

VS Code插件生态失控危机(MCP时代成本暴雷预警):从日均$23.6运维损耗到零预算优化的完整路径

更多请点击: https://intelliparadigm.com 第一章:VS Code插件生态失控危机的本质诊断 VS Code 插件生态的爆发式增长已悄然演变为一场系统性风险——表面繁荣之下,是权限泛滥、依赖污染、更新失序与兼容性黑洞的叠加。其本质并非工具冗余&a…...