Почему pandas быстрее numpy в простых математических операциях? - PullRequest
2 голосов
/ 17 июня 2020

Недавно я заметил, что pandas быстрее при умножении. Я покажу вам это на примере ниже. Как это возможно при таких простых операциях? Как такое вообще возможно? Базовый контейнер данных в pandas фреймах данных - numpy массивы.

Измерения

Я использую массивы / фреймы данных с формами (10k, 10k).

import numpy as np
import pandas as pd

a = np.random.randn(10000, 10000)
d = pd.DataFrame(a.copy())
a.shape
(10000, 10000)
d.shape
(10000, 10000)
%%timeit
d * d
53.2 ms ± 333 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
a * a
318 ms ± 12.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Наблюдения

pandas примерно в пять-шесть раз быстрее, чем numpy, чтобы оценить это простое умножение. Как это может быть?

1 Ответ

2 голосов
/ 17 июня 2020

Pandas использует numexpr за кулисами

Pandas использует numexpr под капотом, если он установлен. Это правда в моем случае. Если я использую numexpr явно, я получаю следующее.

Измерение

С numexpr.evaluate можно вычислить «действительное» числовое выражение для numpy.ndarrays.

import numexpr
%%timeit
numexpr.evaluate('a * a')
52.7 ms ± 398 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Наблюдения

Время стены для оценки произведения массива с самим собой теперь плюс минус столько же, сколько требуется для pandas.

Заключение

Могут быть случаи, когда pandas быстрее, чем numpy. С другой стороны, используя numexpr вместе с numpy, можно получить такое же ускорение. Но делать это нужно «по-своему». Кроме того, это необычный вариант использования pandas. Обычно есть фрейм данных с индексом или мультииндексом (иерархическим индексом), прикрепленным по крайней мере к одной оси. Например, необходимо изучить умножение кадров данных на не равный MultiIndex (широковещательная передача).

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