2 回答
TA贡献1886条经验 获得超2个赞
您正在list.count循环中使用。这是非常低效的。相反,先通过一次来获取计数,然后再通过一次来过滤这些计数。线性与二次时间。因此,使用快速collections.Counter对象:
from collections import Counter
def dupFind(dup_list=(),output_path=""):
counts = Counter(dup_list)
duplicates = {(x, c) for x, c in counts.iteritems() if c > 1}
...
请注意,我将您的默认dup_list参数切换为空元组而不是空列表。如果您不了解可变默认参数的工作原理,则它们可能会导致错误。
上面的解决方案确实需要辅助空间,但应该是相当快的,acollections.Counter本质上是dict针对计数进行了优化。
TA贡献1775条经验 获得超8个赞
我看不出与src和 有任何区别tgt,因此我在此介绍了通用列表的解决方案。我认为这个解决方案会加快扫描速度。为了加快速度,我将尝试使用 pypy 或 c。
import sys
def dup_find(sequence, marker=object()):
prev = marker
c = 1
for item in sequence:
if item == prev:
c += 1
else:
if c > 1:
yield prev, c
prev = item
c = 1
if c > 1:
yield prev, c
def print_dup(sequence, output):
for item, count in dup_find(sequence):
output.write('%s|%s\n' % (item, count))
with open(sys.argv[1]) as fp:
lines = sorted(map(str.strip, fp))
if len(set(lines)) < len(lines):
print_dup(lines, sys.stdout)
添加回答
举报