项目中需要替换字符串,起初使用万能的re.sub,但是在大数据量情况下发现运行速度很慢。
两种方法的原型:
str.replace(old, new[, max])
old -- 将被替换的子字符串。
new -- 新字符串,用于替换old子字符串。
max -- 可选字符串, 替换不超过 max 次
re.sub(pattern, repl, string, count=0, flags=0)
其中第二个参数repl是替换后的字符串或函数;
第四个参数指替换个数。默认为0,表示每个匹配项都替换。
另外正则表达式被编译成 `RegexObject` 实例被pattern调用
使用简单计数器方法测试如下:
运行后的结果为:
6.78299999237
13.1659998894
3.27900004387
结论:很显然,使用replace对常规字符串替换,速度最快,对于re.sub来说用compile后的obj可以有效减少将近一半的时间。 如果你匹配一个固定的字符串或单个的字符类,并且你没有使用 re 的任何象 IGNORECASE 标志的功能,那么就没有必要使用正则表达式了。
解释:字符串有一些方法是对固定字符串进行操作的,它们通常快很多,因为它们都是一个个经过优化的 C 小循环,用以代替大的、更具通用性的正则表达式引擎。
两种方法的原型:
str.replace(old, new[, max])
old -- 将被替换的子字符串。
new -- 新字符串,用于替换old子字符串。
max -- 可选字符串, 替换不超过 max 次
re.sub(pattern, repl, string, count=0, flags=0)
其中第二个参数repl是替换后的字符串或函数;
第四个参数指替换个数。默认为0,表示每个匹配项都替换。
另外正则表达式被编译成 `RegexObject` 实例被pattern调用
使用简单计数器方法测试如下:
i = 0
a = u'shjahkdlajklsh123hssklaui9jskja0uhsj89cahhc89an0'
starttime = time.time()
cc = re.compile(u'1')
while i < 1000000:
n = cc.sub(u'*',a)
i += 1
endtime = time.time()
print endtime - starttime
i = 0
starttime = time.time()
while i < 1000000:
n = re.sub(u'1',u'*',a)
i += 1
endtime = time.time()
print endtime - starttime
i = 0
starttime = time.time()
while i < 1000000:
n = a.replace(u'1',u'*')
i += 1
endtime = time.time()
print endtime - starttime
运行后的结果为:
6.78299999237
13.1659998894
3.27900004387
结论:很显然,使用replace对常规字符串替换,速度最快,对于re.sub来说用compile后的obj可以有效减少将近一半的时间。 如果你匹配一个固定的字符串或单个的字符类,并且你没有使用 re 的任何象 IGNORECASE 标志的功能,那么就没有必要使用正则表达式了。
解释:字符串有一些方法是对固定字符串进行操作的,它们通常快很多,因为它们都是一个个经过优化的 C 小循环,用以代替大的、更具通用性的正则表达式引擎。