#python #pandas #performance #dataframe
#python #pandas #Производительность #фрейм данных
Вопрос:
Я новичок в python и хочу ускорить выполнение кода. Может ли кто-нибудь помочь мне повысить производительность моего кода? код приведен ниже:
def calcualte_edge_weight(df, r1, r2):
data1 = df[df.reviewer_id == r1]
data2 = df[df.reviewer_id == r2]
products_r1 = set(data1.product_id) # products set on which r1 write reviews
products_r2 = set(data2.product_id) # products set on which r2 write reviews
products_common = products_r1.intersection(products_r2)
total_weight = 0
avg_score = 0
for p in products_common:
rating1 = data1[data1.product_id == p].rating.iloc[0]
rating2 = data2[data2.product_id == p].rating.iloc[0]
time1 = data1[data1.product_id == p].date.iloc[0]
time2 = data2[data2.product_id == p].date.iloc[0]
rd = abs( rating1 - rating2)
td = abs((dt.strptime(str(time1).strip(), '%m/%d/%Y') - dt.strptime(str(time2).strip(), '%m/%d/%Y')).days)
if rd < 2 and td < 10:
total_weight = total_weight 1
avg_score = total_weight/len(products_common)
return avg_score
Комментарии:
1. Если у вас есть рабочий код, который вы хотите улучшить, вы можете проверить, можно ли задать ваш вопрос по теме для codereview.stackexchange.com . Вы должны хотя бы указать, что должен делать код.
Ответ №1:
предстоит проделать большую работу по ускорению вашего кода, прежде всего, pandas iloc — не самый быстрый способ считывания скаляра из ряда. В любом случае я предлагаю вам разделить ваш код на части и проанализировать их. Разделяй и властвуй — хорошая практика. Я предлагаю использовать инструменты для профилирования.
Я разработчик perf_tool, который может быть очень полезен в этих случаях.
Комментарии:
1. профилирование показывает, что большую часть времени функция занимает при выполнении, когда применяется фильтр к фрейму данных. какой самый быстрый способ фильтрации фрейма данных?
2. Лучшим решением здесь является использование масок , они работают хорошо и быстро, потому что вычисляются в векторном