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)