2011-12-01 70 views
5

我目前正在試用Actor-concurreny(在Python上),因爲我想了解更多。所以我選擇了pykka,但是當我測試的時候,它比多了一半,慢了作爲一個正常的功能。pykka - 演員很慢?

該代碼只是看它是否工作;它並不意味着優雅。 :)

也許我做錯了什麼?

from pykka.actor import ThreadingActor 
import numpy as np 

class Adder(ThreadingActor): 
    def add_one(self, i): 
     l = [] 
     for j in i: 
      l.append(j+1) 
     return l 

if __name__ == '__main__': 
    data = np.random.random(1000000) 
    adder = Adder.start().proxy() 
    adder.add_one(data) 
    adder.stop() 

這將運行沒有這麼快:

time python actor.py 

real 0m8.319s 
user 0m8.185s 
sys  0m0.140s 

而且現在的假 '正常' 的功能:

def foo(i): 
    l = [] 
    for j in i: 
     l.append(j+1) 
    return l 

if __name__ == '__main__': 
    data = np.random.random(1000000) 
    foo(data) 

給出了這樣的結果:

real 0m3.665s 
user 0m3.348s 
sys  0m0.308s 

回答

12

那麼,什麼是這裏發生的是你的功能版本正在創建兩個非常大的列表,這是大部分時間。當你介紹演員時,必須複製像列表這樣的可變數據,然後才能將發送給演員以保持適當的併發性。此外,演員內部創建的列表也必須複製以及發送回發件人。這意味着,不是創建兩個非常大的列表,而是創建四個非常大的列表。

考慮設計一些東西,以便數據由演員構建和維護,然後通過對演員的調用來查詢,從而最大限度地減少來回傳遞的消息的大小。嘗試應用最小數據移動原理。在功能情況下傳遞List只是有效的,因爲數據實際上並沒有移動來利用共享內存空間。如果演員在不同的機器上,即使消息數據是不可變的,並且不需要複製,我們也不會享有共享內存空間的好處。

+0

我該如何提高效率?我從numpy陣列中創建了一個元組,但獲得的並不是很高。 (例如:分發循環高效的服務角色。) – Themerius

+0

我更新了我的答案。基本上設計更具挑戰性,但它具有更多的好處,比如在一組機器上執行。 –

+0

謝謝,我現在嘗試構建一些東西。 – Themerius