ama*_*jxq 5 python algorithm set
我有两个大文件.他们的内容如下:
134430513
125296589
151963957
125296589
该文件包含未排序的ID列表.某些ID可能会在单个文件中出现多次.
现在我想找到两个文件的交集部分.这就是两个文件中出现的ID.
我刚把这两个文件读成2套,s1
并且s2
.并获得交叉点s1.intersection(s2)
.但它消耗大量内存并且看起来很慢.
那么有没有更好的或pythonic方式来做到这一点?如果文件中包含许多无法读入set
内存有限的ID,我该怎么办?
编辑:我使用生成器将文件读入2组:
def id_gen(path):
for line in open(path):
tmp = line.split()
yield int(tmp[0])
c1 = id_gen(path)
s1 = set(c1)
Run Code Online (Sandbox Code Playgroud)
所有id都是数字的.并且最大id可能是5000000000.如果使用bitarray,它将消耗更多内存.
其他人已经展示了在 Python 中执行此操作的更惯用的方法,但如果数据的大小确实太大,您可以使用系统实用程序来排序和消除重复项,然后使用 File 是一个返回 1 的迭代器这一事实一次一行,执行以下操作:
import os
os.system('sort -u -n s1.num > s1.ns')
os.system('sort -u -n s2.num > s2.ns')
i1 = open('s1.ns', 'r')
i2 = open('s2.ns', 'r')
try:
d1 = i1.next()
d2 = i2.next()
while True:
if (d1 < d2):
d1 = i1.next()
elif (d2 < d1):
d2 = i2.next()
else:
print d1,
d1 = i1.next()
d2 = i2.next()
except StopIteration:
pass
Run Code Online (Sandbox Code Playgroud)
这避免了内存中一次(对于每个文件)有多于一行(并且系统排序应该比 Python 可以做的任何事情都快,因为它针对这一任务进行了优化)。