python多进程共享字典方案

文章比较了Python内置字典、进程共享的manager.dict和第三方库UltraDict在多进程共享数据时的性能差异,发现manager.dict由于依赖IPC通信性能较差,而UltraDict利用multiprocessing.shared_memory实现共享内存块,性能显著提升。
摘要由CSDN通过智能技术生成

三者对比

先给出demo代码:

import time
from multiprocessing import Manager

from UltraDict import UltraDict


def mul():
    t1 = time.time()
    d = Manager().dict()

    t2 = time.time()
    for i in range(100000):
        d[i] = i
    print(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] = i

    print(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] = i

    print(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

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值