【问题标题】:python: split() efficiency vs character crawling methodpython: split() 效率 vs 字符爬取方法
【发布时间】:2015-07-15 19:07:42
【问题描述】:

我有一个非常大的文本文件来解析一些信息。我所做的每一行都会检查某些关键字(我称它们为“标志”)。一旦我找到“标志”,然后我调用下面的方法并收集标志后面的数据(通常只是一个名称或数字)以查找标志后面的信息我使用下面的方法(有效):

def findValue(string, flag):
    string = string.strip()
    startIndex = string.find(flag) + len(flag)
    index = startIndex
    char = string[index:index+1]
    while char != " " and index < len(string):
        index += 1
        char = string[index:index+1]
    endIndex = index
    return string[startIndex:endIndex]

但是,如果我只使用带有空格的 split() 作为分隔符,然后获取列表中的下一项而不是“抓取”字符,那会容易得多。

我正在解析的日志文件非常大(大约 150 万行或更多行),所以我想知道与我当前的方法相比,在行上使用 split() 是否会损害我的效率以及会损害多少。

【问题讨论】:

  • char = string[index:index+1] 在每个循环中创建一个新字符串,非常低效。 split (string[startIndex:]) 会比您当前的方法快得多。
  • string 是否包含文件的全部内容,还是仅包含一行?
  • "string" 只是一行
  • 另外,如果我错了,请纠正我,string[i] 不等于string[i:i+1] 吗?而且也许更有效率?

标签: python string performance file split


【解决方案1】:

我用字符串'oabsecaosbeoiabsoeib;asdnvzldkxbcoszievbzldkvn.zlisebv;iszdb;vibzdlkv8niandsailbsdlivbslidznclkxvnlidbvlzidbvlzidbvlkxnv'做了一些计时测试,搜索'8',每次100000次:

您的方法:2.156 秒

str.split:0.151 秒

另一个更现实的测试:'hello this is for stack overflow and i absolutely hate typing unecessary characters'

您的方法:0.317 秒

str.split:0.267 秒

最后一次测试,上面的字符串乘以 100 次:

您的方法:0.325 秒

str.split:7.376 秒

不管这怎么说。

在你的情况下,对于超大字符串,我肯定会使用你的函数!

【讨论】:

  • 最后的区别可能是因为他的函数只查找' '第一次出现,而split会查找@的所有出现987654329@.
  • 感谢您提供的数据,线条很长。您刚刚使我免于更改我的 findVaule 实现的大量工作
【解决方案2】:

Python 的split() 函数几乎肯定是用C 编写的,这意味着如果你用Python 编写它,它将比等效代码更快。但是,如果您只是在一行中调用 split()(不是全部 150 万条),差别不会很大。

但是,当您只需要列表中的下一项时,为什么还要使用split()?这可能是所有方法中最有效的:

def findValue(string, flag):
    startIndex = string.find(flag) + len(flag)
    endIndex = string.find(' ', startIndex)
    if endIndex == -1:
        return string[startIndex:]
    else:
        return string[startIndex:endIndex]

【讨论】:

  • 您可能希望包括结束索引延伸到行尾的情况(字符串中没有空格)。在这种情况下,只需设置 endIndex = len(string) + 1。在您的实现中,如果没有找到空格字符,则为 -1,这会截断最后一个字符(第二个切片参数是独占的)
【解决方案3】:

假设你有一个指向文件的文件对象:

current_item = ""
char = file.read(1) 
while char:
  if char != " ":
     current_item += char
  else:
     do_something_about_the_item(current_item)
     current_item = ""

【讨论】:

    【解决方案4】:

    你可以试试python的正则表达式工具re模块,它特别适合解析文本文件。 一些例子: http://www.thegeekstuff.com/2014/07/python-regex-examples/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2013-01-04
      • 2011-10-21
      • 2019-07-05
      • 2014-03-16
      相关资源
      最近更新 更多