【问题标题】:Python - loop time performance reductionPython - 循环时间性能降低
【发布时间】:2018-08-14 05:21:28
【问题描述】:

我有以下代码:

#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 个项目的大型项目列表?

【问题讨论】:

标签: python pandas loops time jupyter


【解决方案1】:

使用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'))

【讨论】:

  • 谢谢@DeepSpace,我会试试你的方法!
猜你喜欢
  • 2014-11-17
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多