提高搜索循环python的效率

时间:2016-02-04 05:18:20

标签: python performance loops

我编写了一个代码来读取文件,查找某行是否包含单词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档/秒),我想知道我是否做了一些效率低下的事情。我无法找到自己,所以任何帮助都会很棒!

3 个答案:

答案 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)