Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
加速Python中NumPy密集型计算的多进程优化策略_创想鸟

加速Python中NumPy密集型计算的多进程优化策略

加速Python中NumPy密集型计算的多进程优化策略

本文探讨了在Python中对NumPy密集型计算进行多进程加速时遇到的常见性能瓶颈。通过分析数据序列化和复制的开销,我们揭示了为何传统的process_map可能适得其反。文章提供了一种基于multiprocessing.Manager共享内存的优化方案,有效避免了重复数据复制,从而显著提升了计算效率,并给出了详细的实现代码和最佳实践。

理解Python多进程/多线程加速的挑战

在python中处理大量计算密集型任务时,利用多核cpu进行并行计算是提高效率的常见方法。对于cpu密集型任务,由于python的全局解释器锁(gil)限制,多线程通常无法实现真正的并行计算,而多进程(multiprocessing)则通过创建独立的python解释器进程来绕过gil,从而实现并行执行。

然而,在使用multiprocessing库或其高级封装(如tqdm.contrib.concurrent.process_map)时,开发者有时会发现性能不升反降,尤其是在处理大型数据结构(如NumPy数组)时。这背后的主要原因在于进程间通信(IPC)的开销,特别是数据序列化和反序列化(即所谓的“pickling”和“unpickling”)过程。

当我们将一个Python对象作为参数传递给一个新创建的子进程时,该对象不会直接在进程间共享内存。相反,它会被序列化(pickled),然后复制到子进程的内存空间中,子进程再对其进行反序列化(unpickled)。对于小型数据,这个开销可以忽略不计,但对于像numpy.ndarray这样的大型数据结构,每次任务调用都进行这种复制操作会消耗大量CPU时间和内存带宽,最终成为整个并行计算的瓶颈。

考虑以下一个模拟NumPy密集型计算的例子,它展示了process_map在处理大型数组时的效率问题:

import timeimport numpy as npfrom tqdm.auto import tqdmfrom tqdm.contrib.concurrent import process_map, thread_map# 模拟生成大型数据集def mydataset(size, length):    for ii in range(length):        yield np.random.rand(*size)# 模拟耗时计算函数def calc(mat):    # 模拟一些耗时的NumPy计算    for ii in range(1000):        avg = np.mean(mat)        std = np.std(mat)    return avg, stddef main_original_test():    ds = list(mydataset((500, 500), 100)) # 100个500x500的NumPy数组    print("--- 原始测试结果 ---")    t0 = time.time()    res1 = []    for mat in tqdm(ds):        res1.append(calc(mat))    print(f'for loop: {time.time() - t0:.2f}s')    t0 = time.time()    res2 = list(map(calc, tqdm(ds)))    print(f'native map: {time.time() - t0:.2f}s')    t0 = time.time()    res3 = process_map(calc, ds) # 使用process_map    print(f'process map: {time.time() - t0:.2f}s')    t0 = time.time()    res4 = thread_map(calc, ds) # 使用thread_map    print(f'thread map: {time.time() - t0:.2f}s')if __name__ == '__main__':    main_original_test()

上述代码在某些环境下可能产生如下结果:

立即学习“Python免费学习笔记(深入)”;

for loop: 51.88snative map: 52.49sprocess map: 71.06s  # 明显慢于for循环thread map: 42.04s   # 略快,但未充分利用多核

可以看到,process_map的执行时间甚至超过了简单的for循环,这正是由于每次调用calc函数时,整个NumPy数组mat都需要被序列化并复制到子进程,导致了巨大的性能开销。thread_map虽然略快,但由于GIL的存在,其加速效果有限。

优化策略:利用共享内存避免数据复制

解决上述问题的关键在于避免在每次任务调用时重复复制大型数据。Python的multiprocessing模块提供了一种解决方案:Manager。Manager对象可以创建一个服务进程,该进程管理共享的Python对象,并允许其他进程通过代理对象来访问这些共享对象。这样,大型数据只需复制一次到Manager的内存中,后续的子进程通过引用来访问,大大减少了进程间通信的开销。

对于我们的NumPy数组列表,我们可以使用Manager().list()来创建一个共享列表。然后,子进程通过列表的索引来访问特定的NumPy数组,而不是直接传递整个数组。

以下是使用multiprocessing.Manager和Pool.starmap进行优化的示例代码:

import timeimport numpy as npfrom multiprocessing import Pool, Manager# 模拟生成大型数据集def mydataset(size, length):    for ii in range(length):        yield np.random.rand(*size)# 适应共享内存的计算函数# 现在接收数据索引和共享列表作为参数def calc_optimized(idx, mat_list):    # 从共享列表中获取NumPy数组    mat = mat_list[idx]    # 模拟一些耗时的NumPy计算    for ii in range(1000):        avg = np.mean(mat)        std = np.std(mat)    return avg, stddef main_optimized_test():    ds = list(mydataset((500, 500), 100)) # 原始数据集    # 1. 创建进程池    # 建议根据CPU核心数设置,例如os.cpu_count()    num_processes = 4    mypool = Pool(num_processes)    # 2. 创建Manager并生成共享列表    manager = Manager()    # 将原始数据集一次性复制到Manager管理的共享列表中    mylist = manager.list(ds)    print(f"n--- 优化后测试结果 ({num_processes} 进程) ---")    t0 = time.time()    # 使用starmap传递多个参数:数据索引和共享列表    # zip(range(len(ds)), [mylist]*len(ds)) 为每个任务生成 (索引, 共享列表) 对    res_optimized = mypool.starmap(calc_optimized, zip(range(len(ds)), [mylist]*len(ds)))    print(f"map with manager: {time.time() - t0:.2f}s")    # 关闭进程池    mypool.close()    mypool.join()    manager.shutdown() # 关闭Manager进程if __name__ == '__main__':    main_optimized_test()

运行上述优化后的代码,其输出结果可能如下:

map with manager: 1.94s

与原始的for循环和process_map相比,性能提升是巨大的。这验证了通过Manager实现共享内存,避免重复数据复制,是解决此类问题的有效途径。

实现细节与注意事项

multiprocessing.Manager: Manager创建了一个单独的进程,该进程负责管理共享对象(如列表、字典等)。其他进程通过代理对象与Manager进程通信来访问这些共享对象。Manager().list(): 当你将一个可迭代对象(如ds)传递给manager.list()时,Manager会将ds中的所有元素一次性复制到其管理的共享列表中。此后,子进程通过mylist[idx]访问数据时,无需再次进行序列化和复制。Pool.starmap(): starmap适用于需要向目标函数传递多个参数的情况。在我们的例子中,calc_optimized函数需要idx(数据索引)和mat_list(共享列表)。zip(range(len(ds)), [mylist]*len(ds))生成了一个迭代器,其中每个元素都是一个元组(idx, mylist),starmap会将这些元组解包作为calc_optimized的参数。进程数量: Pool(num_processes)中的num_processes应根据你的CPU核心数进行调整。对于CPU密集型任务,通常设置为CPU的核心数或核心数减一可以获得最佳性能。资源管理: 在使用Pool和Manager后,务必调用mypool.close()、mypool.join()和manager.shutdown()来正确关闭进程池和Manager进程,释放系统资源。数据可变性: Manager管理的共享对象是可变的。如果多个进程需要修改同一个共享对象,需要额外考虑同步机制(如锁),以避免竞态条件。在我们的例子中,calc_optimized只是读取数据,因此无需额外同步。适用场景: 这种方法最适用于:处理大量相同结构但数据不同的任务。每个任务都需要访问一个或多个大型数据集。数据在任务执行期间是只读的或修改后不需要立即同步回主进程的。

总结

在Python中对NumPy等库进行计算密集型任务的并行加速时,简单地使用multiprocessing.Pool或process_map可能因数据序列化和反序列化的开销而导致性能下降。通过深入理解其背后的机制,我们发现对于大型数据集,利用multiprocessing.Manager创建共享内存是避免重复数据复制、显著提升并行计算效率的关键。这种方法将数据一次性加载到共享内存,后续子进程通过索引访问,从而消除了主要的性能瓶颈,实现了高效的并行处理。在实际应用中,务必根据任务特性和数据规模选择合适的并行策略。

以上就是加速Python中NumPy密集型计算的多进程优化策略的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1372954.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
使用Pandas高效整合多文件数据:IP、MAC与端口关联教程
上一篇 2025年12月14日 12:46:18
使用 Pandas 高效关联与提取多文件数据
下一篇 2025年12月14日 12:46:32

相关推荐

  • 夸克怎么更换账号登录_夸克App切换与更换账号方法

    夸克怎么更换账号登录_夸克App切换与更换账号方法夸克怎么更换账号登录_夸克App切换与更换账号方法夸克怎么更换账号登录_夸克App切换与更换账号方法夸克怎么更换账号登录_夸克App切换与更换账号方法

    1、可通过设置或个人中心切换账号,若需登录新账号则先退出当前账号再重新登录。 如果您在使用夸克App时需要登录其他账号,但当前账号未退出或未提供切换选项,则可能是由于操作路径不明确。以下是完成账号更换的具体步骤: 本文运行环境:iPhone 15 Pro,iOS 18 一、通过设置菜单切换账号 该方…

    2026年9月25日 • 用户投稿
    300
  • 神游续作《Hades 2》上线! 耕升RTX 5060 追风 OC再闯冥界!

    神游续作《Hades 2》上线! 耕升RTX 5060 追风 OC再闯冥界!神游续作《Hades 2》上线! 耕升RTX 5060 追风 OC再闯冥界!神游续作《Hades 2》上线! 耕升RTX 5060 追风 OC再闯冥界!神游续作《Hades 2》上线! 耕升RTX 5060 追风 OC再闯冥界!

    由独立团队Supergiant倾力打造的动作冒险大作《Hades》凭借其凌厉的战斗系统与深厚的希腊神话背景,曾风靡全球,被誉为现代独立Roguelike游戏的标杆之作。就在9月26日,历经一年半抢先体验阶段的续作《Hades 2》正式登陆PC平台。发售后迅速登顶Steam热销榜单,目前收获高达95%…

    2026年9月25日 • 用户投稿
    100
  • JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决

    JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决JBoss EAP 7.2:JMS MDB 消息丢失问题排查与解决

    本文旨在帮助开发者排查和解决 JBoss EAP 7.2 环境下 JMS MDB 消息丢失的问题。通过分析 JMS 队列的运行时状态,确定是否存在多个消费者,并提供相应的排查命令,最终解决消息无法被 MDB 消费的问题。 在 JBoss EAP 7.2 中,当使用 JMS 消息驱动 Bean (MD…

    2026年9月25日 • 用户投稿
    000
  • 王者荣耀大仙杯报名指南

    王者荣耀大仙杯报名指南王者荣耀大仙杯报名指南王者荣耀大仙杯报名指南王者荣耀大仙杯报名指南

    进入《王者荣耀》游戏后,点击进入微赛事平台。 在赛事列表中找到大仙杯,点击并完成报名操作。 NameGPT名称生成器 免费AI公司名称生成器,AI在线生成企业名称,注册公司名称起名大全。 0 查看详情 打开王者营地APP,搜索并关注主播张大仙的官方账号。 关注成功后,前往活动页面领取专属语音包,完成…

    2026年9月25日 • 用户投稿
    100
  • AI剪辑如何实现情绪识别与音乐节奏自动匹配?

    AI剪辑如何实现情绪识别与音乐节奏自动匹配?AI剪辑如何实现情绪识别与音乐节奏自动匹配?AI剪辑如何实现情绪识别与音乐节奏自动匹配?AI剪辑如何实现情绪识别与音乐节奏自动匹配?

    要实现ai剪辑的情绪识别与音乐节奏自动匹配,需经历“理解内容”和“智能匹配”两个核心环节。1. 情绪识别通过图像识别、色彩分析、人脸检测及nlp技术综合判断视频情绪,如表情、场景、色调和语义信息;2. 音乐匹配依赖音频分析和剪辑逻辑建模,结合音乐节拍、速度与视频动作节奏进行同步;3. 实际使用中需注…

    2026年9月25日 • 用户投稿
    100
  • win10去除快捷方式小箭头方法

    win10去除快捷方式小箭头方法win10去除快捷方式小箭头方法win10去除快捷方式小箭头方法win10去除快捷方式小箭头方法

    1. 如何移除win10快捷方式的小箭头 首先,在桌面上创建一个新的文本文档,接着将以下代码粘贴进去: reg add “HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerShell Icons” …

    2026年9月25日 • 用户投稿
    100
  • Java ParallelStream线程池管理:定制并发与I/O优化

    Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化Java ParallelStream线程池管理:定制并发与I/O优化

    本文深入探讨了Java ParallelStream的线程池管理,特别是如何在I/O密集型任务(如数据库查询)中定制其并发行为。我们将介绍如何通过自定义ForkJoinPool来限制ParallelStream的线程数量,并强调在处理数据库操作时,除了线程池大小,还需关注数据库连接数等关键资源,并讨…

    2026年9月25日 • 用户投稿
    100
  • 豆包 AI 大模型怎样和 AI 旅行攻略工具结合,定制专属小众旅行路线?​

    豆包 AI 大模型怎样和 AI 旅行攻略工具结合,定制专属小众旅行路线?​豆包 AI 大模型怎样和 AI 旅行攻略工具结合,定制专属小众旅行路线?​豆包 AI 大模型怎样和 AI 旅行攻略工具结合,定制专属小众旅行路线?​豆包 AI 大模型怎样和 AI 旅行攻略工具结合,定制专属小众旅行路线?​

    豆包ai大模型结合旅行攻略工具,能有效定制专属、小众旅行路线。1. 明确旅行风格和兴趣点,如自然风光、人文历史或亲子活动,并给出清晰关键词。2. 利用其信息整合能力优化路线逻辑,输入已有行程草稿进行调整并推荐替代地点。3. 挖掘本地化体验,获取非遗项目或野景点等非标准内容。4. 配合地图和旅行工具使…

    2026年9月25日 • 用户投稿
    100
  • 抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退

    抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退抖音巨量千川账户余额怎么提现?抖音巨量千川的钱怎么退

    在当今这个短视频盛行的时代,抖音无疑成为了许多人展示才华、分享生活的舞台。而抖音旗下的巨量千川广告平台,更是让许多商家和创作者通过广告实现了商业变现。在使用巨量千川的过程中,如何提取账户余额成为了一个让人头疼的问题。今天,就让我来为大家详细解析一下抖音巨量千川账户余额提现的全过程,让你轻松提取,安全…

    2026年9月25日 • 用户投稿
    100
  • 控制Java ParallelStream线程池大小与并发优化:策略与最佳实践

    控制Java ParallelStream线程池大小与并发优化:策略与最佳实践控制Java ParallelStream线程池大小与并发优化:策略与最佳实践控制Java ParallelStream线程池大小与并发优化:策略与最佳实践控制Java ParallelStream线程池大小与并发优化:策略与最佳实践

    本文探讨如何有效管理Java ParallelStream的线程池大小,特别是在涉及数据库查询等I/O密集型操作时。我们将介绍通过自定义ForkJoinPool来限制ParallelStream线程的方法,并强调在处理I/O任务时,结合CompletableFuture与专用执行器的重要性。同时,文…

    2026年9月25日 • 用户投稿
    100
  • 主板 M.2 接口的散热设计是否必要?

    主板 M.2 接口的散热设计是否必要?主板 M.2 接口的散热设计是否必要?主板 M.2 接口的散热设计是否必要?主板 M.2 接口的散热设计是否必要?

    对于高性能NVMe SSD,M.2接口散热设计十分必要。其能有效防止高负载下的热节流现象,保障持续性能输出并延长硬盘寿命。尤其在使用PCIe Gen4及以上规格SSD进行大文件传输、游戏或专业工作时,主板自带或额外加装的散热片可显著降低温度。中低端主板附带的简易散热片效果有限,仅适合轻度使用;而中高…

    2026年9月25日 • 用户投稿
    100
  • Java Stream API:高效处理列表数据,按组合键去重并选择最新记录

    Java Stream API:高效处理列表数据,按组合键去重并选择最新记录Java Stream API:高效处理列表数据,按组合键去重并选择最新记录Java Stream API:高效处理列表数据,按组合键去重并选择最新记录Java Stream API:高效处理列表数据,按组合键去重并选择最新记录

    本文详细介绍了如何利用Java Stream API,特别是Collectors.toMap,对包含重复条目的对象列表进行高级过滤。教程将演示如何根据对象的多个字段(如姓名组合)确定唯一性,并在出现重复时,根据特定字段(如日期)选择最新或最符合条件的记录,从而实现数据的高效聚合与筛选。 业务场景与问…

    2026年9月25日 • 用户投稿
    200
  • 微软确认Windows 11和10打印问题,HP Smart App引发疑虑

    微软确认Windows 11和10打印问题,HP Smart App引发疑虑微软确认Windows 11和10打印问题,HP Smart App引发疑虑微软确认Windows 11和10打印问题,HP Smart App引发疑虑微软确认Windows 11和10打印问题,HP Smart App引发疑虑

    N软网报道,微软近期确认,Windows 11与10用户正经历一系列令人头疼的打印故障。问题的核心在于HP Smart App,其相关文档已在官方Windows健康仪表板中更新,详细描述了这一异常状况。据反馈,HP Smart App可能会未经授权地侵入电脑,更改打印机名称及图标设置,导致诸如点击打…

    2026年9月25日 • 用户投稿
    200
  • mysql如何读取数据库数据

    mysql如何读取数据库数据mysql如何读取数据库数据mysql如何读取数据库数据mysql如何读取数据库数据

    MySQL 读取数据库数据有两种常用方法:SELECT 语句,用于从表中提取数据,语法为:SELECT [列名] FROM [表名] [条件] [分组] [条件] [排序] [限制]。fetchall() 方法,用于将所有结果行存储在一个元组列表中。 MySQL 读取数据库数据 MySQL 提供了多…

    2026年9月25日 • 用户投稿
    100
  • Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​

    Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​Deepseek 满血版联合 Copy.ai Templates,套用优质文案框架​

    用 deepseek 满血版 + copy.ai 的模板能高效产出高质量文案;deepseek 擅长理解和生成内容,copy.ai 提供成熟模板,两者结合保障结构与创意;操作时先选 aida、pas、bab 等高频率模板,再将产品信息与模板一同输入 deepseek 生成初稿;使用时需调整模板灵活性…

    2026年9月25日 • 用户投稿
    100
  • sublime如何高亮vue文件语法 _sublime Vue语法高亮方法

    sublime如何高亮vue文件语法 _sublime Vue语法高亮方法sublime如何高亮vue文件语法 _sublime Vue语法高亮方法sublime如何高亮vue文件语法 _sublime Vue语法高亮方法sublime如何高亮vue文件语法 _sublime Vue语法高亮方法

    安装Vue Syntax Highlight插件可让Sublime Text正确高亮.vue文件,支持template、script和style区块的语法着色,提升编辑体验。 要让 Sublime Text 正确高亮 Vue 文件语法,关键是将 .vue 文件识别为支持的语法格式。Vue 单文件组件…

    2026年9月25日 • 用户投稿
    300
  • 快手如何加入快接单_快手加入快接单的条件与流程

    快手如何加入快接单_快手加入快接单的条件与流程快手如何加入快接单_快手加入快接单的条件与流程快手如何加入快接单_快手加入快接单的条件与流程快手如何加入快接单_快手加入快接单的条件与流程

    要开通快手快接单功能,需先满足粉丝门槛:加入工会者需超10万粉丝,未加入者需达30万以上。达标后通过创作者中心或服务列表查看入口,完善信息并等待审核,通过后可在任务广场浏览并承接广告任务,按时完成推广内容以实现变现。 如果您希望在快手平台通过发布广告内容实现收益变现,但发现无法找到或开通快接单功能,…

    2026年9月25日 • 用户投稿
    000
  • Hadoop MapReduce实现累计电量数据的最大小时耗电量计算

    本文详细介绍了如何使用Hadoop MapReduce从累计电量读数中计算出所有住户和所有日期内的最大小时耗电量。教程将分析原始代码的问题,包括自定义Writable类的序列化错误和逻辑缺陷,并提供一个基于两阶段MapReduce任务的完整解决方案,涵盖自定义数据类型、Mapper、Reducer的…

    2026年9月25日
    000
  • Debian邮件服务器如何进行定制开发

    Debian邮件服务器如何进行定制开发Debian邮件服务器如何进行定制开发Debian邮件服务器如何进行定制开发Debian邮件服务器如何进行定制开发

    本文介绍如何在Debian系统上构建和定制邮件服务器。 这包括软件安装、配置和安全增强等关键步骤。 一、软件安装 首先,安装Postfix和Dovecot邮件服务器软件: sudo apt updatesudo apt install postfix dovecot-imapd dovecot-po…

    2026年9月25日 • 用户投稿
    000
  • sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法

    sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法sublime怎么快速切换文件语法类型_sublime修改文件语言类型的方法

    点击状态栏语言名可快速切换语法类型,立即应用高亮规则;2. 用Ctrl+Shift+P或Cmd+Shift+P打开命令面板,输入Set Syntax选择目标语言;3. 通过“Open all with current extension as…”设置默认语法关联,或手动编辑配置文件,使特…

    2026年9月25日 • 用户投稿
    300

发表回复

登录后才能评论
关注微信