8
回答
Python正则表达式速度测试
【寻找人气王】邀新用户免费体验华为云服务,百元话费等你拿!   

原本以为速度会很慢,但测试结果十分令人鼓舞。在模式字符串未编译和已编译的情况下,Core i5-3210M处理器,单核速度达到了90万每秒和180万每秒。

import re
import time

pattern = '/devices/([^/]+)/([^/]+)'
compiled_pattern = re.compile(pattern)
test_rounds = 1000000

begin_time = time.time()
for i in range(test_rounds):
    re.match(pattern, '/devices/sn_201312201560/uplink_frequency')
    re.match(pattern, '/alarm/system')
elapsed_time = time.time() - begin_time
print(test_rounds * 2 / elapsed_time)

begin_time = time.time()
for i in range(test_rounds):
    compiled_pattern.match('/devices/sn_201312201560/uplink_frequency')
    compiled_pattern.match('/alarm/system')
elapsed_time = time.time() - begin_time
print(test_rounds * 2 / elapsed_time)



举报
mallon
发帖于5年前 8回/2K+阅
共有8个评论 最后回答: 5年前
re的compile编译后是python的字节码,好像所有的正则的编译都是这么实现的。然后加上jit的pypy理论上会快更多。

引用来自“郭煜”的答案

re的compile编译后是python的字节码,好像所有的正则的编译都是这么实现的。然后加上jit的pypy理论上会快更多。

不会快很多的

正则内部都是直接C封装的.

只是输入输出做了一个类型转换.

--- 共有 1 条评论 ---
乌龟壳一般的正则引擎的编译都是生成优化过的字节码。python本身就有一套字节码,python解析器本身就能运行这些字节码。然后才是对字节码的再优化,一般都是jit技术了。记得python的re模块是纯python实现的。 5年前 回复

引用来自“郭煜”的答案

re的compile编译后是python的字节码,好像所有的正则的编译都是这么实现的。然后加上jit的pypy理论上会快更多。
@宏哥 是对的,这些算法肯定是用C实现的

引用来自“Mallon”的答案

引用来自“郭煜”的答案

re的compile编译后是python的字节码,好像所有的正则的编译都是这么实现的。然后加上jit的pypy理论上会快更多。
@宏哥 是对的,这些算法肯定是用C实现的

我针对你的代码测试了一下

[root@AY130801221248587d02Z ~]# python retest.py
459023.218172
1571043.94559
[root@AY130801221248587d02Z ~]# pypy retest.py
2944866.39357
5978194.14325

但里面循环太多了,貌似测试的不是re的速度

单独构建了一个很大的字符串后,两者速度差不多。

 

--- 共有 1 条评论 ---
乌龟壳最后都走到一个C写的模块去了,这个模块只负责解析python部分写的opcode,这个不是python本身的opcode。 5年前 回复

引用来自“郭煜”的答案

引用来自“Mallon”的答案

引用来自“郭煜”的答案

re的compile编译后是python的字节码,好像所有的正则的编译都是这么实现的。然后加上jit的pypy理论上会快更多。
@宏哥 是对的,这些算法肯定是用C实现的

我针对你的代码测试了一下

[root@AY130801221248587d02Z ~]# python retest.py
459023.218172
1571043.94559
[root@AY130801221248587d02Z ~]# pypy retest.py
2944866.39357
5978194.14325

但里面循环太多了,貌似测试的不是re的速度

单独构建了一个很大的字符串后,两者速度差不多。

 

应该就是re的速度,你可以弄个空循环比较一下看看

顶部