首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >皮卡-演员很慢?

皮卡-演员很慢?
EN

Stack Overflow用户
提问于 2011-12-01 09:53:49
回答 1查看 3.5K关注 0票数 7

我目前正在实验Actor-concurreny (关于Python),因为我想了解更多这方面的知识。因此,我选择了pykka,但是当我测试它时,它比比普通函数慢一半多。

代码只检查它是否有效;它并不是要优雅的。:)

也许我做错了什么?

代码语言:javascript
复制
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()

它跑得不快:

代码语言:javascript
复制
time python actor.py

real    0m8.319s
user    0m8.185s
sys     0m0.140s

现在虚拟的“正常”功能:

代码语言:javascript
复制
def foo(i):
    l = []
    for j in i:
        l.append(j+1)
    return l

if __name__ == '__main__':
    data = np.random.random(1000000)
    foo(data)

给出了这个结果:

代码语言:javascript
复制
real    0m3.665s
user    0m3.348s
sys     0m0.308s
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-01 11:00:26

所以这里发生的是,您的功能版本正在创建两个非常大的列表,这是大部分时间。当您介绍参与者时,必须复制可变数据(如列表),然后才能将发送到actor ,以维护正确的并发性。此外,当将列表发送回发送方时,还必须复制在参与者内部创建的列表。这意味着,我们没有创建两个非常大的列表,而是创建了四个非常大的列表。

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8339348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档