在python应用程序中,用户上传照片并根据upvotes和唯一注释进行评分。现在想象一下,每张照片都有一个元组,格式为:(uploader_id, vote_score, comment_count)
。接下来,想象一下,我们维护上传的所有照片的元组列表。优化复杂列表操作,涉及多个元组求和(在Python中)
E.g.样本列表可以是:[(1,12,3),(1,-1,6),(2,30,10),(1,0,0),(2,0,1)]
。这显示上传了5张照片,3个由uploader_id
1和2个由uploader_id
2.
我想将上述列表缩小为[(uploader_id, net_score)]
。这里net_score
是特定用户的所有vote_score
和comment_count
值的总和除以所述用户上传的照片的数量。
E.g.前面提到的示例列表将产生[(1,(11+9)/3),(2,(30+11)/2)]
= [(1,6.67),(2,20.5)]
执行此列表操作的最高性能方式是什么?我已经完成了它(见下文),但有多个for循环。有没有更高效的方法?
这里是目前我在做什么:
from collections import defaultdict, Counter
photos_score_list = # list of the format [(uploader_id, vote_score, comment_count)]
photos_total_score_list= [ (k,v1+v2) for k,v1,v2 in photos_score_list]
total_photos = Counter(elem[0] for elem in photos_total_score_list) #dictionary, e.g. Counter({2: 8, 1: 7})
total_scores = defaultdict(int)
for key,val in photos_total_score_list:
total_scores[key] += val
uploader_scores = []
for key,val in total_scores.items():
uploader_scores.append(key)
uploader_scores.append(val/total_photos[key])
set_benchmark(uploader_scores)
注意uploader_scores
与解压的元组(即的,而不是[1,6.67,2,20.5]
这[(1,6.67),(2,20.5)]
是故意的结束了 - 我喂列表到Redis的。 - 这是最好的方式来做到这一点(即不要担心)
你对当前的代码有任何性能问题吗?我会为了它而反对优化 – user312016
是的。这是一个高流量的现场应用程序,其中性能变得至关重要。否则我不会问这个问题。 –
嗯,你为什么不想在DB或redis中存储已经计算好的聚集?在这种情况下,每次上传新照片时都会更新它,并在没有任何附加步骤的情况下获取数据。 – opalczynski