7

我目前正在尝试使用 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
4

1 回答 1

14

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

考虑设计一些东西,以便数据由参与者构建和维护,然后通过调用参与者进行查询,从而最大限度地减少来回传递的消息的大小。尝试应用最小数据移动的原则。在功能案例中传递 List 只是有效的,因为数据实际上并没有移动以利用共享内存空间。如果参与者在不同的机器上,即使消息数据是不可变的并且不需要复制,我们也不会享受共享内存空间的好处。

于 2011-12-01T11:00:26.087 回答