python多进程共享字典方案

三者对比

先给出demo代码:

import time
from multiprocessing import Managerfrom UltraDict import UltraDictdef mul():t1 = time.time()d = Manager().dict()t2 = time.time()for i in range(100000):d[i] = iprint(f"[multiple] insert value: {time.time() - t2} s")d.get(100)print(f"[multiple]time cost: {time.time() - t1} s")def normal():t1 = time.time()d = dict()t2 = time.time()for i in range(100000):d[i] = iprint(f"\n[normal] insert value: {time.time() - t2} s")d.get(100)print(f"[normal]time cost: {time.time() - t1} s")def ultra():t1 = time.time()d = UltraDict(name="test", buffer_size=10 * 1024 * 1024)t2 = time.time()for i in range(100000):d[i] = iprint(f"\n[ultra] insert value: {time.time() - t2} s")d.get(100)print(f"[ultra]time cost: {time.time() - t1} s")if __name__ == "__main__":mul()normal()ultra()

上面示例给出了三种字典的方式去读/写数据。python自带的 dict,进程共享的 manager.dict 以及第三方库实现的 UltraDict
输出时间:

[multiple] insert value: 2.5106427669525146 s
[multiple]time cost: 2.616278648376465 s[normal] insert value: 0.006000518798828125 s
[normal]time cost: 0.006000518798828125 s
WARNING:root:You are running on win32, potentially without locks. Consider setting shared_lock=True[ultra] insert value: 0.20628571510314941 s
[ultra]time cost: 0.20628571510314941 s

可见 manager.dict 是相当的慢。

起因

由于手中有一个项目,需要多进程共享字典,并对字典有读取和修改操作,一时想到的是使用 manager.dict 来共享数据,结果却大跌眼镜,通过一些第三方工具查看耗时操作发现:
耗时分析截图
大部分耗时操作发生在 _send_recv 操作。
因为 pythonmanager.dict 是靠IPC通信来共享数据的,性能是较差的。

因此,找了很多资料,发现了 UltraDict 这个库,底层是通过 multiprocessing.shared_memory 来共享内存块达到数据共享的目的,在我的场景下,有了质的提升。

[manager.dict] - cost_time : 92.13363575935364 seconds
[UltraDict] - cost_time : 4.1907031536102295 seconds

差距相当明显。。。

感兴趣的朋友可以看看源码,作者的实现方式很值得学习:UltraDict

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/459164.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习: AutoAugment】使用 AutoAugment 提高深度学习性能

【深度学习: AutoAugment】使用 AutoAugment 提高深度学习性能 结果 深度学习在计算机视觉领域的成功可以部分归因于大量标记训练数据的可用性——随着训练数据的质量、多样性和数量的增加,模型的性能通常会提高。然而,收集足够的高质量数据来…

cesium mapboxgl+threebox glb 朝向问题

一、3Dbuilder打开glb 二、cesium在pitch和heading都为0的情况下,不设置模型的朝向 三、mapboxglthreebox在pitch和bearing都为0的情况下,不设置模型的朝向 四、对于地图默认视角,cesium设置pitch-90、heading0的时候和mapboxglthreebox设置p…

2023年全国职业院校技能大赛软件测试赛题第3套

2023年全国职业院校技能大赛 软件测试赛题第3套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 …

【Linux C | I/O模型】IO复用 | poll、ppoll函数详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

BUGKU-WEB 留言板

题目描述 题目无需登录后台!需要xss平台接收flag, http协议需要http协议的xss平台打开场景后界面如下: 解题思路 看到此类的题目,应该和存储型xss有关,也就是将恶意代码保存到服务器端即然在服务器端,那就…

(2024,VLM,操纵链)CogCoM:训练大型视觉语言模型,通过操作链深入细节

CogCoM: Train Large Vision-Language Models Diving into Details through Chain of Manipulations 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 2. 方法 2.1. 术语 2.2…

C语言之自定义类型:联合和枚举

目录 1. 联合体类型的声明2. 联合体的特点3. 联合体大小的计算联合的一个练习 4. 枚举类型的声明5. 枚举类型的优点6. 枚举类型的使用 1. 联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型 但是编译器只为最大…

一篇文章了解Python中的对象(狠狠爱住)

Python中的对象 在Python中,对象是面向对象编程的核心。几乎Python中的一切都是对象,包括数字、字符串、函数、类等。每个对象都有一个身份、一个类型和一个值。 对象的特性 身份(Identity):每个对象都有一个唯一的身…

SpringBoot全局异常捕获处理实现方案

在Spring Boot中实现全局异常处理可以通过以下方式: 使用ControllerAdvice注释创建一个全局异常处理类,并使用ExceptionHandler注释来定义具体异常的处理方法。 import your.package.IllegalNumberException; import org.springframework.http.HttpSta…

java面试题:MySQL中的各种JOIN的区别

表关联是频率非常高的一种数据库操作,在MySQL中,这种JOIN操作有很多类型,包括内联接、左外连接、右外连接等等,而每种连接的含义都不一样,如果死记硬背,不仅很难记住,而且也容易搞混淆&#xff…

前端页面禁止debugger调试并跳转空白页面----文心一言官网实现方式

技术点:setInterval定时器Object.defineProperty 背景: 某天打开文心一言想看看接口返回结构是怎样的,熟练的打开浏览器开发者工具查看网络请求。 发现出现了以下debugger断点 这难不倒我,去掉断点调试,继续下一步不…

《数电》理论笔记-第2章-组合逻辑电路

一,集成门电路 1TTL门电路 TTL门电路中双极型三极管构成,它的特点是速度快、抗静电能力强集成度低、功耗大, 目前广泛应用于中、小规模集成电路中。 TTL门电路有 74 (商用) 和 54 (军用) 两大系列,每个系列中又有若干子系列。 2 CMOS门电路 …