Python的re.split()与split()的区别
在我进行优化的过程中,我发现内置的 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()
了。