【问题标题】:Improving efficiency of search loop python提高搜索循环python的效率
【发布时间】:2016-02-04 05:18:20
【问题描述】:

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

【问题讨论】:

  • 这里的 readf 是什么?
  • @AlokThakur 抱歉,这只是一个错字。它与名为read_file 的文件相同。做出改变
  • 文件有多大?
  • @Claudiu 文件范围从几 KB 到 100 MB 不等

标签: python performance loops


【解决方案1】:

当您执行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

【讨论】:

  • OP 可能不熟悉enumerate,所以你可以在上面添加一个词或链接:)。
【解决方案2】:

您总是检查行中的两个字符串。此外,索引很重,因为您正在寻找文件,而不是行。使用“in”或“find”会更快,因为只有在找到 table_begin 之前检查它,在你看到 table_begin 之后才检查 table_end。如果您不确定每个文件都有 table_begin 和 table_end 的顺序(并且每个文件只有一个),您可能需要在此处进行一些调整/检查(也许将您的开始/结束配对成元组?)

编辑:合并枚举并从 while 切换到 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"

【讨论】:

    【解决方案3】:

    很明显,你通过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)
      

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2015-10-08
      • 1970-01-01
      • 2019-11-06
      • 2018-04-18
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多