【问题标题】:Python re.split() vs split()Python re.split() 与 split()
【发布时间】:2011-11-22 00:43:34
【问题描述】:

在我的优化任务中,我发现内置的 split() 方法比等效的 re.split() 方法快 40%。

一个虚拟基准(易于复制粘贴):

import re, time, random 

def random_string(_len):
    letters = "ABC"
    return "".join([letters[random.randint(0,len(letters)-1)] for i in range(_len) ])

r = random_string(2000000)
pattern = re.compile(r"A")

start = time.time()
pattern.split(r)
print "with re.split : ", time.time() - start

start = time.time()
r.split("A")
print "with built-in split : ", time.time() - start

为什么会有这种差异?

【问题讨论】:

  • 为什么不呢?请不要说“好奇”。您有什么问题通过要求我们阅读restr 的实现并评论差异来解决。也许您可以阅读实现、评论差异并提出具体问题。
  • 我实际上预计速度会增加 %40 以上。简单就是更快。
  • 我认为 split() 使用某种正则表达式很明显(?),但它没有......
  • @hymloth 你把 Python 和 Java 搞混了(这是我知道的唯一一种在 String.split() 中使用正则表达式的语言)
  • @Sven Perl 中有什么东西使用正则表达式吗?

标签: python regex


【解决方案1】:

re.split预计会变慢,因为使用正则表达式会产生一些开销。

当然,如果您要在 constant 字符串上进行拆分,则使用 re.split() 毫无意义。

【讨论】:

  • @duhaime 因为正则表达式是为简单的常量字符串匹配不够的情况而设计的。如果您不需要额外的功能,那么使用内置的常规 split() 是有意义的
  • 啊,有趣,我不知道!感谢您关注@AlexSpurling
【解决方案2】:

如有疑问,请联系check the source code。您可以看到 Python s.split() 针对空白和内联进行了优化。但s.split() 仅适用于固定分隔符。

为了权衡速度,基于re.split 正则表达式的拆分要灵活得多。

>>> re.split(':+',"One:two::t h r e e:::fourth field")
['One', 'two', 't h r e e', 'fourth field']
>>> "One:two::t h r e e:::fourth field".split(':')
['One', 'two', '', 't h r e e', '', '', 'fourth field']
# would require an addition step to find the empty fields...
>>> re.split('[:\d]+',"One:two:2:t h r e e:3::fourth field")
['One', 'two', 't h r e e', 'fourth field']
# try that without a regex split in an understandable way...

re.split()慢了 29%(或者 s.split() 仅快了 40%)应该是令人惊奇的。

【讨论】:

    【解决方案3】:

    运行正则表达式意味着您正在为每个字符运行状态机。 使用常量字符串进行拆分意味着您只是在搜索字符串。 第二个是一个简单得多的过程。

    【讨论】:

    • @eyquem 不使用状态机进行搜索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多