如何更有效地编写此代码以使其运行更快?

时间:2019-04-01 12:07:34

标签: 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 个答案:

答案 0 :(得分:0)

似乎您的问题对于for循环来说太大了。启动子流程以并行而不是顺序地计算这些步骤可能会很有趣。您知道多处理模块吗?您可以尝试查看this article,尤其是最后使用from multiprocessing import Queue的示例。