【问题标题】:How to get a set of unique values from many lists efficiently (Python)如何有效地从多个列表中获取一组唯一值(Python)
【发布时间】:2016-03-27 23:35:28
【问题描述】:

我有许多(大约 6000 个)文本文件,每个文件都有一个 ID 列表(文件中的每个 ID 在新行上)。每个文件中可能有 10000 到 1000 万个 ID。

如何从所有这些文件中获取一组唯一 ID?

我当前的代码如下所示:

import glob
kk=glob.glob('C://Folder_with_all_txt_files/*')
ID_set=set()
for source in kk:
    a=[]
    csvReader = csv.reader(open(source, 'rt'))
    for row in csvReader:
        a.append(row)
    for i in xrange(len(a)):
        a[i]=a[i][0]
    s=set(a)
    ID_set=ID_set.union(s)
    del a,s

当前代码的问题:

  • 1) 消耗过多内存
  • 2) 太慢了

有没有更有效的方法来完成这项任务?

另外,是否可以在此任务中使用所有 CPU 内核?

【问题讨论】:

    标签: python performance set unique


    【解决方案1】:

    一些想法:

    • 跳过集合s的创建。直接更新 ID_set
    • 根据文件的外观,您可以只使用 read()str.split() 而不是 CSV 阅读器。

    也许这样的东西适用于您的数据集:

    import glob
    
    id_set = set()
    for filename in glob.glob('C://Folder_with_all_txt_files/*'):
        with open(filename) as f:
            ids = f.read().split()
            id_set.update(ids)
    

    【讨论】:

    • 谢谢!现在工作得更快了..但仍然消耗大量内存(
    【解决方案2】:

    这种方法可能比 Raymond 的慢一点,但它避免了一次将每个文件加载到内存中:

    import glob
    
    ids = set()
    for filename in glob.glob('C://Folder_with_all_txt_files/*'):
        with open(filename) as f:
            for id_ in f:
                ids.add(id_.strip())
    

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2021-06-06
      • 2011-04-03
      • 2012-03-23
      • 1970-01-01
      相关资源
      最近更新 更多