Как я могу написать этот код более эффективно, чтобы он выполнялся быстрее?

#python-3.x

#python-3.x

Вопрос:

Функция кода заключается в преобразовании набора данных таким образом, чтобы для каждой заданной пары фильмов подсчитывалось количество пользователей, которые смотрели оба фильма, и отслеживалось это значение (сохранялось как значение столбца).

Я пробовал писать код как таковой, но при увеличении количества пар выполнение занимает много времени.

 def dataset_to_item_graph(self):
    self.dataset1=self.dataset
    items=self.dataset['movieId'].unique()
    print(len(items))
    ux=combinations(items,2)

    item_edges=[]
    for x in ux:
        i = x[0]
        j = x[1]
        a = set(self.dataset1.loc[self.dataset1['movieId'] == i]['userId'])
        b = set(self.dataset1.loc[self.dataset1['movieId'] == j]['userId'])
        c = a.intersection(b)
        if len(c) >0:
            edge_list=[i,j,len(c)]
            item_edges.append(edge_list)
        else:
            continue

    item_graph = pd.DataFrame(item_edges, columns=['movie1','movie2','weight'])

    return item_graph


This is the sample dataset I am working with:      
        userId  movieId  rating  timestamp
     0       1        1     4.0  964982703
     1       1        3     4.0  964981247
     2       1        6     4.0  964982224
     3       1       47     5.0  964983815
     4       1       50     5.0  964982931
     5       2        1     3.0  964982931
     6       2        3     4.0  964982831
     7       2        6     4.0  964982933
     8       3        47    5.0  964981249
     9       3        1     2.0  964981248
    10       3        50    3.5  965982931


This is the output I am expecting:
        movieId1  movieId  sum
     0         1        3    2
     1         1        6    2
     2         1       47    2
     3         1       50    2
     4         3        6    1
     5         3       47    1
     6         3       50    1
     7         6       47    1
     8         6       50    1
     9         47      50    2
  

Комментарии:

1. У меня сейчас нет времени на кодирование и тестирование, но я думаю, что это могло бы помочь выполнить groupby на movieId , затем сопоставить их с набором пользователей, что должно значительно снизить затраты на фильтрацию; затем выполнить комбинации для фильмов, и пользователи для фильма теперь должны быть быстро доступны (для очень быстрого пересечения подсчет)

2. Я довольно новичок в программировании на Python, если вы могли бы написать код, когда будете свободны, чтобы помочь мне разобраться, я буду очень благодарен. Спасибо

Ответ №1:

Похоже, ваша проблема в том, что цикл for настолько велик. Было бы интересно запускать подпроцессы для вычисления этих шагов параллельно, а не последовательно. Знаете ли вы модуль многопроцессорной обработки? Вы могли бы попробовать просмотреть эту статью, особенно пример в конце, в котором используется from multiprocessing import Queue .