Почему операции с pandas.DataFrame
s такие медленные ?! Взгляните на следующие примеры.
Измерение:
- Создайте
numpy.ndarray
, заполненный случайными числами с плавающей запятой - Создайте
pandas.DataFrame
, заполненный тем же numpy массивом
Я измеряю время следующих операций
Для numpy.ndarray
- Суммируйте по оси 0
- Сумма по оси 1
Для pandas.DataFrame
- Сумма по оси 0
- Возьмите сумму по оси 1
Для pandas.DataFrame.values -> np.ndarray
- Возьмите сумму по 0- ось
- Возьмите сумму по 1-оси
Наблюдения
- Суммирование
numpy.ndarrays' is much faster then operating on
pandas. `. - Это даже верно, если
pd.DataFrame
не содержит только числа с плавающей запятой и не имеет ничего особенного (MultiIndex или что-то еще). - Операции с
numpy.ndarray
составляют от 7 до 10 раз быстрее.
Вопросы
- Почему это происходит?
- Как это можно оптимизировать?
- Не может ли
pandas
звонить или пройти через операции numpy
s?
import numpy as np
import pandas as pd
n = 50000
m = 5000
array = np.random.uniform(0, 1, (n, m))
dataframe = pd.DataFrame(array)
Numpy
%%timeit
array.sum(axis=0)
206 ms ± 3.78 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
array.sum(axis=1)
233 ms ± 33.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Pandas
%%timeit
dataframe.sum(axis=0)
1.65 s ± 14.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
dataframe.sum(axis=1)
1.74 s ± 15.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Pandas без Pandas
Давайте оперируем только значениями ...
%%timeit
dataframe.values.sum(axis=0)
206 ms ± 7.13 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
dataframe.values.sum(axis=1)
181 ms ± 1.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)