Я думаю, что 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

Ответы на вопрос(1)

Ваш ответ на вопрос