我编写了一个代码来读取文件,查找某行是否包含单词table_begin
,然后计算直到包含单词table_end
的行的行数。
这是我的代码 -
for line in read_file:
if "table_begin" in line:
k=read_file.index(line)
if 'table_end' in line:
k1=read_file.index(line)
break
count=k1-k
if count<10:
q.write(file)
我必须在~15K文件上运行它,因为它有点慢(~1档/秒),我想知道我是否做了一些效率低下的事情。我无法找到自己,所以任何帮助都会很棒!
答案 0 :(得分:8)
执行read_file.index(line)
时,您正在扫描整个行列表,只是为了获取您已经在线的索引。这很可能会减慢你的速度。相反,请使用enumerate()
跟踪行号:
for i, line in enumerate(read_file):
if "table_begin" in line:
k = i
if "table_end" in line:
k1 = i
break
答案 1 :(得分:1)
您始终在检查该行中的两个字符串。此外,索引很重,因为您正在寻找文件,而不是行。使用&#34; in&#34;或者&#34;找到&#34;会更快,因为只有在你找到它之前才会检查table_begin,并且在你看到table_begin之后会查看table_end。如果你不是肯定的,那么每个文件都有这个顺序的table_begin和table_end(并且只有一个)你可能需要在这里进行一些调整/检查(可能将你的开始/结束配对成元组?)
编辑:合并枚举并从一段时间切换到一个for循环,允许删除一些复杂性。
def find_lines(filename):
bookends = ["table_begin", "table_end"]
lines = open(filename).readlines()
for bookend in bookends:
for ind, line in enumerate(lines):
if bookend in line:
yield ind
break
for line in find_lines(r"myfile.txt"):
print line
print "done"
答案 2 :(得分:1)
显然,您通过f.readlines()
,which is a bad idea获取了read_file,因为您读取了所有文件。
你可以通过以下方式赢得很多时间:
10行后停止。
with open('test.txt') as read_file:
counter=0
for line in read_file:
if "table_begin" in line : break
for line in read_file:
counter+=1
if "table_end" in line or counter>=10 : break # if "begin" => "end" ...
if counter < 10 : q.write(file)