找到两个列表/集并集大小的最快方法?编码效率

Fastest way to find the size of the union of two lists/sets? Coding Efficiency

提问人:user27606 提问时间:6/29/2023 最后编辑:user27606 更新时间:6/30/2023 访问量:40

问:

我正在研究Reddit上不同社区之间的关系。作为我数据研究的一部分,我有大约 49,000 个 CSV 用于我抓取的子,在我能获得的所有帖子中,我得到了每个评论员及其总业力和评论数量(格式见图片)每个 CSV 都包含我为该单个子收集的所有评论者。

我想获取每个潜艇,然后将其与另一个潜艇进行比较,并确定它们有多少共同的用户。我不需要列出他们是什么用户,只需要两者的共同点。我还想为我目前拥有的代码设置一个业力阈值,它设置为超过 30 业力。

对于我拥有的代码,我准备了两个超过阈值的用户列表,然后将这两个列表转换为集合,然后将它们“&”在一起。这是我的代码:

由于我一遍又一遍地重新阅读相同的 CSV 以相互比较,我是否可以准备它们以使其更有效,按字母顺序对用户名进行排序?我计划重做所有 CSV 以摆脱“删除用户”,这些用户都是机器人,我是否应该按业力而不是用户进行排序,而不是比较业力是否高于某个水平,它只读取到某个点?内存使用不是问题,只是速度。我有数十亿次比较要做,所以任何时间的减少都是值得赞赏的。

remove_list = dt.fread('D:/Spring 2023/red/c7/removal_users.csv')
drops = remove_list['C0'].to_list()[0]
def get_scores(current):
    sub = dt.fread(current)
    sub = pd.read_csv(current, sep=',', header =None)
    current = get_name(current)
    sub.columns = ['user','score']
    sub = sub[~sub['user'].isin(drops)]
    sub = sub[sub['score'] > 30]
    names =list(sub['user'])
    return names
def get_name(current):
    current = current.split('/')[-1].split('.')[-2]
    return current
def common_users(list1,list2):
    return len(set(list1) & set(list2))
Python 性能 比较

评论

1赞 Barmar 6/29/2023
不要重读 CSV。 将所有内容加载到数据帧或数据库表中,并将它们用于其余的处理。
0赞 user27606 6/29/2023
我已经尝试过这个,它的 39GB CSV,我尝试使用稀疏数据表,但这无法加载到内存中,并且我有 128GB 的 RAM
0赞 dankal444 6/29/2023
您可以尝试在加载过程中“压缩”这些 CSV、int8/16 而不是 doubles、string -> int 使用查找表等。先做行分析,缩小问题范围,也许重读csv毕竟不是瓶颈

答:

1赞 ahmad 6/29/2023 #1

您是否尝试过使用 len() 函数,它用于查找列表的长度。len() 接受序列或集合作为参数。

评论

0赞 user27606 6/29/2023
我在普通用户的代码片段中使用了 len:“len(set(list1) & set(list2))”