如何一次编译多个多个正则表达式?它效率更高吗? - 蟒蛇

时间:2015-09-30 18:39:23

标签: python regex dictionary compilation

我们说我有一个代码:

import re
docid_re = re.compile(r'<DOCID>([^>]+)</DOCID>')
doctype_re = re.compile(r'<DOCTYPE SOURCE="[^"]+">([^>]+)</DOCTYPE>')
datetime_re = re.compile(r'<DATETIME>([^>]+)</DATETIME>')

我也可以这样做:

>>> import re
>>> docid_re = r'<DOCID>([^>]+)</DOCID>'
>>> doctype_re = r'<DOCTYPE SOURCE="[^"]+">([^>]+)</DOCTYPE>'
>>> datetime_re = r'<DATETIME>([^>]+)</DATETIME>'
>>> docid_re, doctype_re, datetime_re = map(re.compile, [docid_re, doctype_re, datetime_re])
>>> docid_re
<_sre.SRE_Pattern object at 0x7f0314eee438>

但是当我使用map()时,速度或内存是否有任何实际好处?

2 个答案:

答案 0 :(得分:1)

如果您正在编译正则表达式的批次,那么map可能有助于避免查找re所涉及的查找费用,然后在每次调用时获取其compile属性;使用map,您只需查看map一次,re.compile一次,然后无需进一步查找即可反复使用。当然,当你需要构建一个list来使用它时,你可以节省开支。实际上,你需要大量的正则表达式才能达到map值得你这么做的地步;三,这可能是一种损失。

即使它确实有所帮助,它也是最微小的微观优化。我会这样做,如果它使代码更清洁,性能是最好的三级关注。有些情况(例如,将整数的大文本文件解析为int),其中map可能是一个很大的胜利,因为启动它的开销可以通过减少的查找和Python字节代码来补偿执行开销。但这不是其中之一,而且这些案件非常罕见,不值得担心99.99%的时间。

答案 1 :(得分:1)

不要听任何人 - 只是测量它!您可以使用timeit模块。但请记住,&#34; premature optimization is the root of all evil&#34; (c)Donald Knuth。

顺便说一句,回答你的问题&#34;不,它根本没有帮助&#34;。