Почему простые операции с pandas .DataFrames так медленны по сравнению с такими же операциями с numpy .ndarrays? - PullRequest
2 голосов
/ 27 мая 2020

Почему операции с pandas.DataFrame s такие медленные ?! Взгляните на следующие примеры.

Измерение:

  • Создайте numpy.ndarray, заполненный случайными числами с плавающей запятой
  • Создайте pandas.DataFrame, заполненный тем же numpy массивом

Я измеряю время следующих операций

  1. Для numpy.ndarray

    • Суммируйте по оси 0
    • Сумма по оси 1
  2. Для pandas.DataFrame

    • Сумма по оси 0
    • Возьмите сумму по оси 1
  3. Для pandas.DataFrame.values -> np.ndarray

    • Возьмите сумму по 0- ось
    • Возьмите сумму по 1-оси

Наблюдения

  • Суммирование numpy.ndarrays' is much faster then operating onpandas. `.
  • Это даже верно, если pd.DataFrame не содержит только числа с плавающей запятой и не имеет ничего особенного (MultiIndex или что-то еще).
  • Операции с numpy.ndarray составляют от 7 до 10 раз быстрее.

Вопросы

  1. Почему это происходит?
  2. Как это можно оптимизировать?
  3. Не может ли 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)

1 Ответ

0 голосов
/ 27 мая 2020

Pandas использует numpy в качестве базовых контейнеров данных, но предоставляет гораздо больше возможностей. DataFrame содержит коллекцию 1D numpy массивов, возможно, различных типов, а также 2 индекса (один для строк и один для столбцов). Эти индексы могут быть даже типа MultiIndex.

Все это требует снижения производительности.

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

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