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

つまり、ここで起こっていることは、機能バージョンが2つの非常に大きなリストを作成しているということです。これは大部分の時間です。アクターを導入する場合、適切な同時実行性を維持するために、リストなどの可変データをアクターに送信する前にコピーする必要があります。また、アクター内に作成されたリストは、送信者に返送するときにもコピーする必要があります。これは、2つの非常に大きなリストが作成される代わりに、4つの非常に大きなリストが作成されることを意味します。

データがアクターによって構築および維持され、アクターへの呼び出しによって照会されて、やり取りされるメッセージのサイズを最小限に抑えるように設計することを検討してください。最小限のデータ移動の原則を適用してみてください。機能的な場合にリストを渡すことは、データが実際には共有メモリ空間を活用するために移動していないため、効率的です。アクターが別のマシン上にある場合、メッセージデータが不変であり、コピーする必要がなかったとしても、共有メモリスペースの利点はありません。

于 2011-12-01T11:00:26.087 に答える