Я думаю, что Numba работает очень хорошо из-за SIMD-векторизации цикла. Вы можете проверить это с помощью llvmlite.binding как llvm llvm.set_option ('', '--debug-only = loop-vectorize'). С правильными настройками C-Compiler Cython также может выполнить то же самое. (Эквивалент будет (-O3, -march = native) с компилятором Clang)
то пользуюсь пандамиmask
а такжеwhere
методы для более чистой логики при обновлении значений в серии условно. Тем не менее, для относительно критичного к производительности кода я заметил значительное падение производительности по сравнению сnumpy.where
.
Хотя я рад принять это для конкретных случаев, мне интересно знать:
Делать пандmask
/ where
методы предлагают любую дополнительную функциональность,Помимо inplace
/ errors
/ try-cast
параметры? Я понимаю эти 3 параметра, но редко использую их. Например, я понятия не имею, чтоlevel
параметр относится к.Есть ли нетривиальный контрпример, гдеmask
/ where
Превосходитnumpy.where
? Если такой пример существует, это может повлиять на то, как я выберу подходящие методы в будущем.Для справки приведем несколько сравнительных тестов для Pandas 0.19.2 / Python 3.6.0:
np.random.seed(0)
n = 10000000
df = pd.DataFrame(np.random.random(n))
assert (df[0].mask(df[0] > 0.5, 1).values == np.where(df[0] > 0.5, 1, df[0])).all()
%timeit df[0].mask(df[0] > 0.5, 1) # 145 ms per loop
%timeit np.where(df[0] > 0.5, 1, df[0]) # 113 ms per loop
Представление расходитсяв дальнейшем для нескалярных значений:
%timeit df[0].mask(df[0] > 0.5, df[0]*2) # 338 ms per loop
%timeit np.where(df[0] > 0.5, df[0]*2, df[0]) # 153 ms per loop