хочу ускорить выполнение моего кода на python

#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. Лучшим решением здесь является использование масок , они работают хорошо и быстро, потому что вычисляются в векторном