Python - 循环时间性能降低

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python - 循环时间性能降低相关的知识,希望对你有一定的参考价值。

我有以下代码:

#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'))

以上是关于Python - 循环时间性能降低的主要内容,如果未能解决你的问题,请参考以下文章

Python 代码性能随线程而降低

循环文件映射会降低性能

openmp:线程数的增加会降低性能

具有相同功能的活动和片段

计算循环内的平均值会降低性能

Python - 循环加速 - 大型数据集