Python字符串替换效率对比:replace与re.sub哪个更快?

  • 单纯的替换,正则的效率比 replace 低三倍左右
  • 那什么时候正则的效率比 replace 高呢?
import re,timeit
str = "abcdefghigkqpwueriwutghlskajdf,mnbz,xcnvoiequynf12341234321065498+7mnbz,xcnvoiequynf12341234321065498+7mnbz,xcnvoiequynf12341234321065498+7mnbz,xcnvoiequynf12341234321065498+7"

pattern1

start = timeit.default_timer() for i in range(1000000): tst = re.sub(“mn|123|[abcdef7]”, “”, str) stop = timeit.default_timer() print(‘pattern1’, 'Time: ', stop - start)

pattern2

start = timeit.default_timer() for i in range(1000000): tst = str.replace(“mn”, “”) tst = tst.replace(“123”, “”) tst = tst.replace(“a”, “”) tst = tst.replace(“b”, “”) tst = tst.replace(“c”, “”) tst = tst.replace(“d”, “”) tst = tst.replace(“e”, “”) tst = tst.replace(“f”, “”) tst = tst.replace(“7”, “”)

stop = timeit.default_timer() print(‘pattern2’, 'Time: ', stop - start)

pattern3

start = timeit.default_timer() for i in range(1000000): tst = re.sub(“mn”, “”, str) stop = timeit.default_timer() print(‘pattern3’, 'Time: ', stop - start)

pattern4

start = timeit.default_timer() for i in range(1000000): tst = str.replace(“mn”, “”)

stop = timeit.default_timer() print(‘pattern4’, 'Time: ', stop - start)

输出

pattern1 Time: 10.851562640495892

pattern2 Time: 4.726493571613192

pattern3 Time: 1.5144934460814898

pattern4 Time: 0.5535754144044809


Python字符串替换效率对比:replace与re.sub哪个更快?

6 回复

原理上就是差很远,sub 的适用性广很多。


对于字符串替换的效率问题,str.replace() 在简单固定模式替换时通常比 re.sub() 快得多,因为正则表达式引擎有额外的解析和匹配开销。

看个实测例子:

import re
import timeit

text = "hello world, this is a test string with multiple words to replace."
pattern = "test"
replacement = "demo"

# 测试 str.replace()
def test_replace():
    return text.replace(pattern, replacement)

# 测试 re.sub()
def test_re_sub():
    return re.sub(pattern, replacement, text)

# 基准测试
replace_time = timeit.timeit(test_replace, number=100000)
re_sub_time = timeit.timeit(test_re_sub, number=100000)

print(f"str.replace() 耗时: {replace_time:.4f} 秒")
print(f"re.sub() 耗时: {re_sub_time:.4f} 秒")
print(f"replace 比 re.sub 快 {re_sub_time/replace_time:.1f} 倍")

在我的机器上跑出来,replace() 大概比 re.sub() 快 3-5 倍。这很好理解:replace() 就是个简单的字符查找替换,而 re.sub() 要先编译正则模式,再用状态机去匹配,开销自然大。

不过要注意,如果替换规则复杂(比如用正则表达式匹配模式、需要捕获组、或者条件替换),那 re.sub() 是唯一选择。简单固定字符串替换无脑用 replace() 就行。

总结:固定字符串替换用 replace(),需要模式匹配才用 re.sub()

你用 ipython 自己跑一下下面的代码吧,你的写法有两个很大的问题:
1. 用正则确不先 compile
2. 居然用 str 做变量名

https://gist.github.com/hieast/1fc9e5dad298a62178236c0c7bf9f035.js

我测试的时候也做了用 compile 和不用的区别,感觉没有太大提升,这个例子就没有放里。变量名 abc 啥的我都是随手写的啦,没有计较。

我测的情况是 compile 后 py27 和 py36 都减少了 40% 的运行时间, 正则速度和 replace 差距都不超过一倍,感觉效率方面基本没有讨论的意义了。
一楼的朋友说的很好,正则灵活多了。

re.sub 有编译缓存。

回到顶部