我有以下代码:
#Create an empty data frame to store item affinity scores for items.
itemAffinity= pd.DataFrame(columns=('item1', 'item2', 'score'))
rowCount=0
for ind1 in itemList:
item1user = itemuser_dict[ind1]
for ind2 in itemList:
if ind1 == ind2:
continue
item2user = itemuser_dict[ind2]
commonUsers = len(item1user.intersection(item2user))
affinity_score = commonUsers / len(item1user)
#Add a score for item 1, item 2
itemAffinity.loc[rowCount] = [ind1,ind2,affinity_score]
rowCount +=1
我花了很长时间等待i7-7700的进程(小时),而itemList只有2000个项目。我想问一下是否有任何方法可以加快代码性能,因为我有一个带有>的大项目列表50k项?
答案 0 :(得分:0)
使用loc
添加行的效率非常低(每次添加一行时,都会重新创建列'底层数组)。
相反,准备所有数据并立即创建整个数据框:
lines = []
for ind1 in itemList:
item1user = itemuser_dict[ind1]
for ind2 in itemList:
if ind1 == ind2:
continue
item2user = itemuser_dict[ind2]
commonUsers = len(item1user.intersection(item2user))
affinity_score = commonUsers / len(item1user)
lines.append({'item1': ind1, 'item2': ind2, 'score': affinity_score})
itemAffinity = pd.DataFrame(data=lines, columns=('item1', 'item2', 'score'))
请注意,columns
不是必需的,但它会确保列符合您的预期顺序。
另请注意,您在同一列表中有一个O(n ^ 2)算法(嵌套for
循环)并且不清楚(item1user, item2user)
是否与{{1}相同}。如果是这样,您可以使用(item2user, item1user)
:
itertools.combinations