【问题标题】:Python 3: How to compare two big files fastest?Python 3:如何最快地比较两个大文件?
【发布时间】:2016-09-06 11:03:17
【问题描述】:

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

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

【问题讨论】:

  • 使用字典,你会显着加快not in的查找速度。
  • 您可以使用set 而不是list 来附加值以跳过检查是否存在重复项。
  • @spectras 和 vishes_shell 非常感谢你帮助我 :)

标签: python json hash compare


【解决方案1】:

在列表中查找项目需要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']))

【讨论】:

  • setdict 中查找项目的平均复杂度为O(1)。查看this page。所以你的解决方案比你想象的还要好:)
  • 感谢您的评论。我来自 c++ 背景,我经常犯这个错误。
  • 你当然可以在 c++ 中拥有相同的功能,实际上 CPython 解释器是用 C 编写的。他们只是为 dict 选择了不同的实现,使用带有 some tweaks 的哈希表。它的主要优点是查找速度非常快,但显然必须在其他操作中为此付出代价,尤其是插入时“非常糟糕”的最坏情况。
  • 太棒了!目前,我的程序运行速度非常快:D
猜你喜欢
  • 2016-11-12
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多