Python re.split()与split()的比较

Python re.split()与split()的比较,python,regex,Python,Regex,在我的优化任务中,我发现内置的split()方法比re.split()等效方法快约40% 虚拟基准(易于复制粘贴): 为什么会有这种差异?运行正则表达式意味着为每个字符运行一个状态机。 使用常量字符串进行拆分意味着您只是在搜索字符串。 第二个是一个简单得多的过程。re.split预计会慢一些,因为正则表达式的使用会产生一些开销 当然,如果您是在一个常量字符串上进行拆分,那么在有疑问时使用re.split()是没有意义的。您可以看到Pythons.split()针对空格和内联进行了优化。但是s.s

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

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


为什么会有这种差异?

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

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

当然,如果您是在一个常量字符串上进行拆分,那么在有疑问时使用
re.split()

是没有意义的。您可以看到Python
s.split()
针对空格和内联进行了优化。但是
s.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()

为什么不呢?请不要说“好奇”。通过让我们阅读
re
str
的实现并对差异进行评论,您有什么问题可以解决。也许你可以阅读这些实现,评论它们之间的差异,并提出具体的问题。实际上,我预计速度会提高40%以上。Simple速度更快。我认为很明显(?)split()使用了某种正则表达式,但它没有…@hymloth您当时把Python和Java混淆了(这是我所知道的唯一一种在
String.split()中使用正则表达式的语言)@Sven Perl中是否有任何东西不使用正则表达式?@eyquem不使用状态机进行搜索。@duhaime,因为正则表达式是为简单常量字符串匹配不够的情况而设计的。如果您不需要额外的电源,那么使用常规内置的split()是有意义的。啊,很有趣,我不知道!感谢您关注@AlexSpurling
>>> 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...