我目前正在实验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发布于 2011-12-01 11:00:26
所以这里发生的是,您的功能版本正在创建两个非常大的列表,这是大部分时间。当您介绍参与者时,必须复制可变数据(如列表),然后才能将发送到actor ,以维护正确的并发性。此外,当将列表发送回发送方时,还必须复制在参与者内部创建的列表。这意味着,我们没有创建两个非常大的列表,而是创建了四个非常大的列表。
考虑设计一些东西,以便数据由参与者构造和维护,然后通过对参与者的调用来查询,以最小化消息来回传递的大小。尝试应用最小数据移动性(MinimumDataMoving)的原则。在函数用例中传递列表是有效的,因为数据实际上并没有移动到利用共享内存空间。如果参与者在另一台机器上,那么即使消息数据是不可变的,并且不需要复制,我们也不会有共享内存空间的好处。
https://stackoverflow.com/questions/8339348
复制相似问题