2011-12-01 4 views
5

В настоящее время я экспериментирую с Actor-concurreny (на Python), потому что хочу узнать больше об этом. Поэтому я выбрал pykka, но когда я его тестирую, это больше, чем наполовину, как медленно как обычная функция.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 

ответ

12

Так что такое здесь происходит то, что ваша функциональная версия создает два очень больших списка, которые составляют большую часть времени. Когда вы вводите актеров, изменяемые данные, подобные спискам, должны быть скопированы перед отправкой актеру для обеспечения надлежащего параллелизма. Также список, созданный внутри актера, также должен быть скопирован, когда отправляется обратно отправителю. Это означает, что вместо создания двух очень больших списков мы создаем четыре очень больших списка.

Рассмотрите возможность создания объектов так, чтобы данные были сконструированы и поддерживались актером, а затем были запрошены звонки актеру, минимизирующие размер сообщений, передаваемых взад и вперед. Попробуйте применить принцип минимального перемещения данных . Передача списка в функциональном случае эффективна только потому, что данные на самом деле не перемещаются, чтобы использовать разделяемое пространство памяти. Если бы актер находился на другой машине, у нас не было бы преимущества общего пространства памяти, даже если данные сообщения были бы неизменными и не нуждались в копировании.

+0

И как я могу сделать это эффективным? Я сделал кортеж из numpy-массива, но коэффициент усиления не очень высок. (Например: распределите цикл эффективнее над серверными участниками.) – Themerius

+0

Я обновил свой ответ. В принципе, это сложнее разрабатывать, но имеет больше преимуществ, таких как выполнение над кластером машин. –

+0

Спасибо, я сейчас пытаюсь что-то построить. – Themerius

 Смежные вопросы

  • Нет связанных вопросов^_^