python - 使用python3.7进行慢列表解析以去除重复项
问题描述
我正在尝试从包含 4.4 GB 的 2.5 亿个项目的大型文本文件中删除重复项目。
让我印象深刻的是,我可以使用以下代码在几分钟内将此文件加载到 python 列表中:
x = []
with open("online.txt") as file:
for l in file:
x.append(l)
print('count of array: ')
print(len(x))
但是,当我尝试简单地检查以确保在将下一个项目添加到数组之前不存在时,需要花费数小时才能完成。我觉得我错过了一些可以真正加快速度的简单东西。
这是我用来检查重复项目的代码:
a = []
x = []
with open("online.txt") as file:
for l in file:
if l in a:
print('duplicate')
print(l)
else:
x.append(l.strip())
a.append(l)
print('with duplicates: ');
print(len(a))
print('without duplicates: ')
print(len(x))
这是在具有 64 Gigs 内存和现代双至强处理器的服务器上运行的。
解决方案
问题在于一个简单的列表,python 每次添加新条目之前都必须搜索每个条目。
您可以尝试使用 python 字典或集合而不是列表。这些数据结构可以更快地确定条目是否已经存在。
只需更改您的代码:
a = {} # set
x = {}
with open("online.txt") as file:
for l in file:
if l in a:
print('duplicate')
print(l)
else:
x.add(l.strip()) # add to the set
a.add(l)
您没有指定输入文件格式,但可能通过将整个数据集加载到一个巨大的字符串中来提高速度,然后使用 python 函数将其拆分,而不是像您在此处那样手动进行。
推荐阅读
- javascript - Javascript 事件处理和调用堆栈问题/内存泄漏
- python - 使用 Python 在终端中运行聊天室时出现无限循环错误
- git - 我不确定从哪里重新设置我的功能分支?
- javascript - 直接访问子文件夹中的 Angular 9 路由会抛出 404?
- c# - uwp 组合框 ContainerfromIndex(0) 始终返回 null
- java - 如何在 Thymeleaf 的文本中创建链接?
- regex - 如何使用正则表达式验证电话号码?
- python - 如何编写一个函数来计算python中从n到m位置的列表中偶数元素的乘积?
- angular - 禁用元素并删除其他 [disabled] 道具的指令
- ios - 呈现 UIViewController 时如何为视图设置动画?