Я пытаюсь взять 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
понял. в дальнейшем буду использовать timeit, спасибо!






Когда вы просто вызываете столбец, вы сокращаете его до серии 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() не делает это автоматически по умолчанию? Есть ли какие-то (не временные) затраты на это?
Несколько причин, о которых я могу припомнить, самая важная из них заключается в том, что python обычно не меняет тип объекта, если пользователь явно не просит об этом, чтобы предотвратить путаницу в типах. Вот почему они включают атрибут .values на тот случай, если вы хотите его использовать, но вы можете создавать дополнительные последовательные операции поверх .min(), которые не работают с ndarrays.
Это не объясняет разницы между df['A'].mean() и df['A'].values.mean() (первый на моей машине быстрее).
На моей машине у меня есть 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).
Методы Pandas имеют много накладных расходов. Некоторые из них связаны с данными NaN, выравниванием индексов и т. д.
Вы не должны использовать
time.time()для профилирования. Для этого есть модульtimeit.