Python 皮卡——演员动作慢?

Python 皮卡——演员动作慢?,python,actor,pykka,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 = []

我目前正在试验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()
这并不是很快:

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

所以这里发生的事情是,您的函数版本正在创建两个非常大的列表,这是大部分时间。引入参与者时,必须先复制列表等可变数据,然后才能将其发送给参与者,以保持适当的并发性。此外,在参与者内部创建的列表在发送回发件人时也必须复制。这意味着我们没有创建两个非常大的列表,而是创建了四个非常大的列表


考虑设计一些东西,以便数据由参与者构建和维护,然后通过调用参与者来查询,从而最小化来回传递的消息的大小。尝试应用最小数据移动原则。在函数情况下传递列表是有效的,因为数据实际上并没有移动到利用共享内存空间的位置。如果参与者在另一台机器上,即使消息数据是不可变的,不需要复制,我们也不会获得共享内存空间的好处。

我该如何使这一点变得高效?我用numpy数组制作了一个元组,但是增益不是很高。(例如:在多个参与者之间高效地分配循环。)我更新了我的答案。基本上,它的设计更具挑战性,但它有更多的好处,比如在一组机器上执行。谢谢,我现在尝试构建一些东西。100%同意这个答案,但具体到Pykka,默认情况下实现不会复制消息。请参阅文档中的最后一行。