Python的re.split()与split()的区别

23 投票
3 回答
47966 浏览
提问于 2025-04-17 02:46

在我进行优化的过程中,我发现内置的 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

为什么会有这样的差异呢?

3 个回答

4

运行正则表达式就像是对每个字符进行状态机的操作,也就是说,它会根据每个字符的情况来决定接下来要做什么。

而用一个固定的字符串来进行分割,就只是简单地在找这个字符串而已。

后者的过程要简单得多。

10

当你不确定的时候,可以去看看源代码。你会发现,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%)。

29

re.split 这个函数通常会比较慢,因为它使用了正则表达式,这会带来一些额外的开销。

当然,如果你只是想根据一个固定的字符串来分割,那就没必要使用 re.split() 了。

撰写回答