pykka - 演员很慢?

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在不同的机器上,即使消息数据是不可变的并且不需要复制,我们也不会有共享内存空间的好处.

  • 100%同意这个答案,但特定于Pykka,默认情况下,实现不会复制邮件.请参阅本文档[本节]的最后一行(http://pykka.readthedocs.org/en/latest/#sending-messages). (3认同)