python 大量文本文件的文件操作变慢

python file operation slowing down on massive text files

此 python 代码运行的时间越长,速度就越慢。

谁能告诉我为什么?

我希望它不会为我查询的每一行重新编制索引并重新从头开始计数,我认为它会是某种文件流?!

从 10k 到 20k 需要 2 秒。从 300k 到 310k 大约需要 5 分钟。并且变得更糟。 到那时为止,代码在 ELSE 部分只有 运行 并且 'listoflines' 在那个时候是常量(列表中有 850000 行)并且类型为 'list[ ]' 以及 'offset'在这一点上只是一个常数 'int'。

源文件有数百万行,最多超过2000万行。

'dummyline not in listoflines' 每次都需要相同的时间。

with open(filename, "rt") as source:
    for dummyline in source:
        if (len(dummyline) > 1) and (dummyline not in listoflines):
            # RUN compute
            # this part is not reached where I have the problem
        else:
            if dummyalreadycheckedcounter % 10000 == 0:
            print ("%d/%d: %s already checked or not valid " % (dummyalreadycheckedcounter, offset, dummyline) )
            dummyalreadycheckedcounter = dummyalreadycheckedcounter +1

实际上 in list 的操作每次都不一样,实际上它是 O(n) 所以当你添加时它变得越来越慢

您想使用套装 看这里https://wiki.python.org/moin/TimeComplexity

你没有要求这个,但我建议把它变成一个处理管道,这样你的计算部分就不会与去重逻辑混合

def dedupped_stream(filename):
    seen = set()
    with open(filename, "rt") as source:
        for each_line in source:
            if len(line)>1 and each_line not in seen:
                seen.add(each_line)
                yield each_line

那你就可以

for line in dedupped_stream(...):
    ...

你根本不需要担心这里的重复数据删除

与@Sedy Vlk 观点相同。 请改用散列(即 python 中的字典)。

clines_count = {l: 0 for l in clines}
for line in nlines:
    if len(line) > 1 and line in clines_count:
        pass
    else:
        if counter % 10000 == 0:
            print ("%d: %s already checked or not valid " % (counter, line) )
        counter += 1