Как ускорить функцию струн панд? - PullRequest
0 голосов
/ 07 июня 2018

Я использую векторизованный метод pr.as str.split () для извлечения первого элемента, возвращенного из разбиения на «~».Я также пытался использовать df.apply () с лямбдой и str.split () для получения эквивалентных результатов.При использовании% timeit я обнаружил, что df.apply () работает быстрее, чем векторизованная версия.

Все, что я читал о векторизации, похоже, указывает на то, что первая версия должна иметь лучшую производительность.Может кто-нибудь объяснить, почему я получаю эти результаты?Пример:


     id     facility      
0   3466     abc~24353  
1   4853     facility1~3.4.5.6   
2   4582     53434_Facility~34432~cde   
3   9972     facility2~FACILITY2~343
4   2356     Test~23 ~FAC1  

Приведенный выше фрейм данных имеет около 500 000 строк, и я также протестировал около 1 миллиона с похожими результатами.Вот несколько примеров ввода и вывода:

Векторизация

In [1]: %timeit df['facility'] = df['facility'].str.split('~').str[0]
1.1 s ± 54.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Lambda Apply

In [2]: %timeit df['facility'] = df['facility'].astype(str).apply(lambda facility: facility.split('~')[0])
650 ms ± 52.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Кто-нибудь знает, почему у меня такое поведение?
Спасибо!

1 Ответ

0 голосов
/ 07 июня 2018

Строковые методы панд только «векторизованы» в том смысле, что вам не нужно писать цикл самостоятельно.На самом деле никакого распараллеливания не происходит, потому что строки (особенно проблемы регулярных выражений) по своей сути трудно (невозможно?) Распараллелить.Если вы действительно хотите скорость, вы должны вернуться к питону здесь.

%timeit df['facility'].str.split('~', n=1).str[0]
%timeit [x.split('~', 1)[0] for x in df['facility'].tolist()]

411 ms ± 10.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
132 ms ± 302 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Для получения дополнительной информации о том, когда циклы выполняются быстрее, чем функции панд, ознакомьтесь с Для циклов с пандами - Когда мне это нужно? .

Что касаетсяпочему apply быстрее, я полагаю, что функция apply применяется (т. е. str.split) намного легче, чем расщепление струны в недрах Series.str.split.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...