簡體   English   中英

Python-循環時間性能降低

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM