Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何一次编译多个正则表达式?效率更高吗python_Python_Regex_Dictionary_Compilation - Fatal编程技术网

如何一次编译多个正则表达式?效率更高吗python

如何一次编译多个正则表达式?效率更高吗python,python,regex,dictionary,compilation,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 = re.compile(r'<DOCID>([^>]+)</DOCID>')
doctype_re = re.compile(r'<DOCTYPE SOURCE="[^"]+">([^>]+)</DOCTYPE>')
datetime_re = re.compile(r'<DATETIME>([^>]+)</DATETIME>')
重新导入
docid_re=re.compile(r'([^>]+))
doctype_re=re.compile(r'([^>]+)'
>>>datetime_re=r'([^>]+)'
>>>docid\u re,doctype\u re,datetime\u re=map(re.compile,[docid\u re,doctype\u re,datetime\u re])
>>>文件
但是当我使用
map()时,在速度或内存方面有什么真正的提高吗

如果你编译了很多正则表达式,
map
可能会帮助你避免查找
re
所涉及的查找成本,然后在每次调用中获得它的
compile
属性;使用
map
,你可以查找
map
一次并重新编译
re.compile
一次,然后在没有f的情况下反复使用它进一步的查找。当然,当你需要构建一个
列表来使用它时,你会消耗掉节省下来的钱。实际上,你需要大量的正则表达式才能达到
map
值得你花时间的程度;对于三个人来说,这可能是一个损失


即使它确实有帮助,这也是最微小的微优化。如果它能使代码更干净,我也会这样做,性能最多是第三个问题。有些情况下(比如,将一个巨大的整数文本文件解析为
int
s)where
map
可能是一个巨大的胜利,因为启动它的开销可以通过减少的查找和Python字节码执行开销来补偿。但这不是其中的一种情况,而且这种情况非常罕见,以至于99.99%的时间都不值得担心。

不要听任何人讲话,只要测量一下就可以了!您可以使用模块fo但是请记住,“(c)Donald Knuth


顺便说一句,回答你的问题“不,一点帮助都没有”.

您是否使用正则表达式解析xml?看起来确实如此。您是否尝试过测量它?实际上,在这种情况下,
timeit
模块会欺骗您。因此,您可能会将性能改进视为相对于总成本的一个实质性好处,而事实上,在实际代码中,编译的正则表达式不会已经在缓存中,并且节省成本首先,要将编译的开销与缓存进行细微的比较。您需要显式地
re.purge()
每个循环上的缓存(当然,这会增加另一种令人困惑的开销).@alvas,automatically-ShadowRanger已经在官方文档中发布了一个关于它的文档。你可以在
注释
部分中阅读它。显式编译和隐式编译的主要区别在于显式编译意味着你得到了一个可以直接使用的
正则表达式
对象;如果该对象是本地对象或在类实例上,查找比导入到全局名称空间的
re
更便宜(感谢搜索)。当您使用模块级函数时,它仍然必须在缓存中查找模式以查找
regex
,如果您使用了一堆其他
regex
,则
regex
可能已经过时。显式
compile
避免了这一点。坦率地说,我最喜欢编译regex的地方是它允许您使用许多
re带有一个参数的gex
方法,这意味着它可以很容易地与函数方法一起使用,如
map
filter
(以及
多处理.Pool
上的类似方法);
map
filter
通常比等效的列表理解(Py2)或生成器表达式(Py3)慢,但对于较大的可重用性,当映射函数/过滤器谓词在
C
中实现时(
regex
方法大多是这样),
map
filter
速度更快,因为它们避免了查找成本,并将所有执行推到C层(当然仅在CPython中)@Jimilian:我承认,过早优化是万恶之源。我之所以这么做的唯一原因是,这是我以前使用过的
timeit
(通过
ipython
%timeit
魔术)之一为了研究这样的东西的性能,我有足够的经验说“是的,它可以跑得更快,但是不,加速永远不会有意义”。
>>> 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>