Метод Pandas .min () не кажется самым быстрым

Я пытаюсь взять mins, maxs, means и т. д. Из столбцов моего Pandas df (все числовые значения какого-либо типа), и мне не кажется, что методы Pandas самые быстрые. Похоже, если я впервые использую .values, время выполнения этих операций значительно улучшится. Это желаемое поведение (имеется в виду, что Панды делают что-то глупое или преднамеренное? Возможно, я использую дополнительную память, нажимая на нее с помощью .values, или я делаю предположения и / или упрощаю это каким-то образом, что не задано ...) .

«Свидетельства» неожиданного поведения:

df = pd.DataFrame(np.random.randint(0,1000,size=(100000000, 4)), columns=list('ABCD'))

start = time.time()
print(df['A'].min())
print(time.time()-start)`

# 0
# 1.35876178741


start = time.time()
df['A'].values.min()
print(time.time()-start)

# 0
# 0.225932121277

start = time.time()
print(np.mean(df['A']))
print(time.time()-start)

# 499.49969672
# 1.58990907669

start = time.time()
print(df['A'].values.mean())
print(time.time()-start)

# 499.49969672
# 0.244406938553

Вы не должны использовать time.time() для профилирования. Для этого есть модуль timeit.

DYZ 10.12.2018 17:53

понял. в дальнейшем буду использовать timeit, спасибо!

JRalston 10.12.2018 18:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
334
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы просто вызываете столбец, вы сокращаете его до серии pandas, которая основана на массиве numpy, но с гораздо большим количеством оберток вокруг него. Объекты Pandas оптимизированы для операций с электронными таблицами или базами данных, таких как объединения, поиск и т. д.

Когда вы вызываете .values для столбца, он превращает его в массив numpy, который является dtype, оптимизированным для математических и векторных операций в C. Даже с «разворачиванием» в тип ndarray эффективность математических операций превосходит рядовые типы данных. Вот краткое обсуждение некоторых различий.

В качестве примечания, есть специальный модуль - timeit для такого типа сравнения времени.

type(df['a'])

pandas.core.series.Series

%timeit df['a'].min()

6.68 ms ± 121 µs per loop

type(df['a'].values)

numpy.ndarray

%timeit df['a'].values.min()

696 µs ± 18 µs per loop

Прохладный. Есть ли причина, по которой Pandas .min() не делает это автоматически по умолчанию? Есть ли какие-то (не временные) затраты на это?

JRalston 10.12.2018 18:00

Несколько причин, о которых я могу припомнить, самая важная из них заключается в том, что python обычно не меняет тип объекта, если пользователь явно не просит об этом, чтобы предотвратить путаницу в типах. Вот почему они включают атрибут .values на тот случай, если вы хотите его использовать, но вы можете создавать дополнительные последовательные операции поверх .min(), которые не работают с ndarrays.

G. Anderson 10.12.2018 18:06

Это не объясняет разницы между df['A'].mean() и df['A'].values.mean() (первый на моей машине быстрее).

ayhan 10.12.2018 18:11

На моей машине у меня есть 1.16 ms ± 43.2 µs per loop для column.mean() и 901 µs ± 20.3 µs per loop для column.values.mean(). Разница небольшая, но заметная. (Dataframe построен на 1000000 строк случайного типа int). Если я выполняю операцию .mean с серией поплавков той же длины, я получаю примерно в 8 раз лучшее время работы с .values() (8.73 ms по сравнению с 1.2 ms).

G. Anderson 10.12.2018 18:15

Методы Pandas имеют много накладных расходов. Некоторые из них связаны с данными NaN, выравниванием индексов и т. д.

Scott Boston 10.12.2018 18:23

Другие вопросы по теме