Распараллеливание или иное ускорение вычислений в кадре генератора и панд - PullRequest
0 голосов
/ 08 ноября 2018

Я делаю расчет перестановок вещей из генератора, созданного itertools. У меня есть кусок кода в этой форме (это фиктивный пример):

import itertools
import pandas as pd

combos = itertools.permutations('abcdefghi',2)
results = []
i=0

for combo in combos:
    i+=1 #this line is actually other stuff that's expensive
    results.append([combo[0]+'-'+combo[1],i])

rdf = pd.DataFrame(results, columns=['combo','value'])

За исключением реального кода,

  • есть несколько сотен тысяч перестановок
  • вместо i+=1 Я открываю файлы и получаю результаты clf.predict, где clf - классификатор, обученный scikit-learn
  • вместо i Я сохраняю значение из этого прогноза

Я думаю, что combo[0]+'-'+combo[1] тривиально.

Это занимает слишком много времени. Что я должен сделать, чтобы сделать это быстрее? Такие как:

1) написание лучшего кода (возможно, я должен инициализировать results правильной длиной вместо использования append, но сколько это поможет? И как лучше всего это сделать, если я не знаю длину до итерация по combs?)

2) инициализация кадра данных pandas вместо списка и использование apply?

3) использование cython в пандах? Всего новичков в этом.

4) распараллеливание ? Я думаю, что мне, вероятно, нужно сделать это, но опять же, абсолютный новичок, и я не знаю, лучше ли это делать в списке или в панде. Я понимаю, что мне нужно перебрать генератор и инициализировать некоторый контейнер перед распараллеливанием .

Какая комбинация этих опций была бы наилучшей и как я могу собрать ее вместе?

1 Ответ

0 голосов
/ 08 ноября 2018

Операция append в пандах и петле for идет медленно. Этот код избегает его использования.

import itertools
import pandas as pd

combos = itertools.permutations('abcdefghi',2)
combo_values = [('-'.join(x[1]), x[0]) for x in enumerate(combos, 1)]

rdf = pd.DataFrame({'combos': [x[0] for x in combo_values],
                    'value': [x[1] for x in combo_values]})

Вы можете сделать это для каждого имеющегося файла и фрейма данных, а затем использовать pd.concat для быстрого генерирования результатов после этого. Вы также можете добавить перечисление перестановок позже, если хотите.

...