У меня есть программа моделирования и скоринга, которая активно использует DataFrame.isin
функцию панд, просматривая списки «похожих» на Facebook записей отдельных пользователей на каждой из нескольких тысяч конкретных страниц. Это самая трудоемкая часть программы, в большей степени, чем части моделирования или оценки, просто потому, что она работает только на одном ядре, а остальные - на нескольких десятках одновременно.
Хотя я знаю, что могу вручную разбить фрейм данных на куски и выполнить операцию параллельно, есть ли простой способ сделать это автоматически? Другими словами, есть ли какой-нибудь пакет, который распознает, что я запускаю легко делегированную операцию, и автоматически распространит ее? Возможно, это требует слишком многого, но в прошлом я был достаточно удивлен тем, что уже доступно в Python, поэтому я думаю, что стоит спросить.
Любые другие предложения о том, как это может быть достигнуто (даже если не с помощью какого-то волшебного пакета единорога!) Также будут оценены. Главным образом, просто пытаясь найти способ сэкономить 15-20 минут на цикл, не тратя столько же времени на кодирование решения.
источник
Ответы:
К сожалению, распараллеливание еще не реализовано в пандах. Вы можете присоединиться к этой проблеме GitHub, если вы хотите участвовать в разработке этой функции.
Я не знаю какой-либо «волшебной упаковки единорога» для этой цели, поэтому лучше всего будет написать собственное решение. Но если вы все еще не хотите тратить на это время и хотите узнать что-то новое - вы можете попробовать два метода, встроенных в MongoDB (каркас редукции и структура agg). Смотрите mongodb_agg_framework .
источник
Я думаю, что ваша лучшая ставка будет Розетта . Я нахожу это чрезвычайно полезным и легким. Проверьте свои панды методами .
Вы можете получить это по пунктам .
источник
Есть полезная
dask
библиотека для параллельных заданий numpy / pandasСсылка: https://github.com/blaze/dask
источник
Существует более распространенная версия этого вопроса, касающаяся распараллеливания функций применения панд - так что это освежающий вопрос :)
Во-первых , я хочу упомянуть более быстрое, поскольку вы попросили «упакованное» решение, и оно появляется в большинстве вопросов SO, касающихся распараллеливания панд.
Но .. Я все еще хотел бы поделиться своим личным основным кодом для него, так как после нескольких лет работы с DataFrame я никогда не находил решение для 100% -ного распараллеливания (в основном для функции apply), и мне всегда приходилось возвращаться за моим " ручной "код.
Благодаря вам я сделал более общей поддержку любого (теоретически) метода DataFrame по его имени (поэтому вам не придется сохранять версии для isin, apply и т. Д.).
Я протестировал его на функциях isin, apply и isna, используя python 2.7 и 3.6. В нем меньше 20 строк, и я следовал соглашению об именах панд, например, "subset" и "njobs".
Я также добавил сравнение времени с dask-эквивалентным кодом для «isin», и оно кажется в X2 раза медленнее, чем этот смысл.
Включает 2 функции:
df_multi_core - это тот, кого вы называете. Он принимает:
_df_split - это внутренняя вспомогательная функция, которая должна располагаться глобально к работающему модулю (Pool.map зависит от места размещения), в противном случае я бы обнаружил ее внутри.
Вот код из моей сущности (я добавлю туда еще функциональные тесты панд):
Bellow - это тестовый код для распараллеленного isin , сравнивающий нативную, многоядерную производительность и производительность. На машине с I7 с 8 физическими ядрами я увеличил скорость примерно в четыре раза. Я хотел бы услышать, что вы получаете на ваших реальных данных!
источник
isin
- кажется, что фрагмент кода наиболее эффективен с 'isin' - в X1.75 раз быстрее, чем dask (по сравнению сapply
функцией, которая только на 5% быстрее, чем dask)