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
此 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