[英]Python - loop time performance reduction
我有以下代碼:
#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的項目?
用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)
是一樣的(item2user, item1user)
如果是這樣,您可以使用itertools.combinations
大大減少迭代次數:
import itertools
combinations = itertools.combinations(itemList, r=2)
lines = []
for ind1, ind2 in combinations:
item1user = itemuser_dict[ind1]
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'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.