7

我有一个字典来存储对象:Python的manager.dict()是非常缓慢相比普通字典

jobs = {} 
job = Job() 
jobs[job.name] = job 

现在我想将其转换为使用管理者字典,因为我想用多和需要分享这个字典amonst进程

mgr = multiprocessing.Manager() 
jobs = mgr.dict() 
job = Job() 
jobs[job.name] = job 

只是通过转换为使用manager.dict()事情变得非常缓慢。

例如,如果使用本机字典,它只需要0.65秒来创建625个对象并将其存储到字典中。

完全相同的任务现在需要126秒!

我可以做的任何优化,以保持manager.dict()与python {}相提并论吗?

回答

6

问题是,由于某种原因,每个插入文件的速度都很慢(在我的机器上速度较慢117倍),但是如果用正常的字典更新manager.dict(),它将是一个快速操作。

jobs = {} 
job = Job() 
jobs[job.name] = job 
# insert other jobs in the normal dictionary 

mgr = multiprocessing.Manager() 
mgr_jobs = mgr.dict() 
mgr_jobs.update(jobs) 

然后使用mgr_jobs变量。

另一种选择是使用广泛采用的multiprocessing.Queue类。

+0

这样可以解决初始创建作业的延迟问题。但是如果我需要多次插入/删除呢?任何想法如何lookup执行manager.dict()相比,普通字典? – ealeon

+0

它看起来像插入对于manager.Queue()也是可怕的。任何想法如何查找和删除执行manager.dict()相比,普通字典? – ealeon

+1

@ealeon'multiprocessing.Queue'(不是经理)怎么样? – JBernardo

0

如果您在游泳池的循环内使用mgr.dict()。您可以使用本地正常词典临时存储结果,然后在环路外更新mgr.dict(),如your_mgr_dict.update(local_dict)