Python 3:如何最快地比较两个大文件?

时间:2016-09-06 11:03:17

标签: python json hash compare

“Big_file.txt ”中,我想提取“用户A”的UID,它与“ Small_file.txt 中的UID不重复” STRONG>”。我写了下面的代码,但它似乎永远不会停止运行。那么,如何加快这个过程呢?非常感谢你:))

import json

uid_available = []
linesB = []
for line in open('E:/Small_file.txt'):
    line = json.loads(line)
    linesB.append(hash(line['uid']))


for line in open('E:/Big_file.txt'):
    line = json.loads(line)
    if hash(line['uid']) not in linesB and line['user'] == 'User A':
        uid_available.append(line['uid'])

这是Big_file.txt格式(有1000万行):

{'uid': 111, 'user': 'User A'}
{'uid': 222, 'user': 'User A'}
{'uid': 333, 'user': 'User A'}
{'uid': 444, 'user': 'User B'}
{'uid': 555, 'user': 'User C'}
{'uid': 666, 'user': 'User C'}

这是Small_file.txt的格式(有几百万行):

{'uid': 333, 'user': 'User A'}
{'uid': 444, 'user': 'User B'}
{'uid': 555, 'user': 'User C'}

我期望的输出:

111
222

1 个答案:

答案 0 :(得分:3)

查找列表中的项目需要O(n)次。如果您使用dictset,则可以将其改进为O(1)

您可以做的最短修改是:

linesB = []
for line in open('E:/Small_file.txt'):
    line = json.loads(line)
    linesB.append(hash(line['uid']))
linesB = set(linesB)

或做得对

linesB = set()
for line in open('E:/Small_file.txt'):
    line = json.loads(line)
    linesB.add(hash(line['uid']))