The*_*ius 7 python actor pykka
我目前正在尝试使用Actor-concurreny(在Python上),因为我想了解更多相关信息.因此我选择了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()
Run Code Online (Sandbox Code Playgroud)
这不会那么快:
time python actor.py
real 0m8.319s
user 0m8.185s
sys 0m0.140s
Run Code Online (Sandbox Code Playgroud)
而现在虚拟'正常'功能:
def foo(i):
l = []
for j in i:
l.append(j+1)
return l
if __name__ == '__main__':
data = np.random.random(1000000)
foo(data)
Run Code Online (Sandbox Code Playgroud)
给出这个结果:
real 0m3.665s
user 0m3.348s
sys 0m0.308s
Run Code Online (Sandbox Code Playgroud)
Nei*_*ssy 14
所以这里发生的是你的功能版本正在创建两个非常大的列表,这是大部分时间.当您引入actor时,必须先复制像列表这样的可变数据,然后再发送给actor 以保持正确的并发性.此外,在发送回发件人时,必须复制在actor内创建的列表.这意味着我们创建了四个非常大的列表,而不是创建两个非常大的列表.
考虑设计一些东西,以便由actor构造和维护数据,然后通过调用actor来查询,最小化来回传递的消息的大小.尝试应用最小数据移动的原则.在功能案例中传递List只是有效的,因为数据实际上并没有移动到利用共享内存空间.如果actor在不同的机器上,即使消息数据是不可变的并且不需要复制,我们也不会有共享内存空间的好处.