搜索Python的字符串regex或find()哪个更快?

搜索Python的字符串regex或find()哪个更快?,python,xml,string-matching,Python,Xml,String Matching,我有一个XML字符串 <tags> <person1>dave jones</person1> <person2>ron matthews</person2> <person3>sally van heerden</person3> <place>tygervalley</place> <ocassion>shopping</ocassion

我有一个XML字符串

<tags>
   <person1>dave jones</person1>
   <person2>ron matthews</person2>
   <person3>sally van heerden</person3>
   <place>tygervalley</place>
   <ocassion>shopping</ocassion>
</tags>

戴夫·琼斯
罗恩·马修斯
萨莉·凡·赫登
提格尔瓦利
购物
我想使用诸如“Sally Van Heerden”或“Tygervalley”之类的搜索词来搜索这个xml字符串

使用regex查找这个字符串中的术语是否更快,或者Python的find()方法是否足够快?我也可以使用python的元素树XML解析器进行搜索,然后构建XML树并进行搜索,但我担心搜索速度太慢

以上三者中哪一个最快? 还有其他建议吗

请记住,可以输入多个搜索词,也可以搜索多个(数千)XML字符串


更新:如何将xml字符串拆分为一个列表,删除所有特殊字符,然后将列表转换为一个集合和一组搜索词。然后得到两个集合的交集?这会很快吗?

正则表达式需要经过一个漫长的编译过程,然后按照一组复杂的规则搜索字符串。
find
函数一次遍历字符串


如果不需要模式,
find
功能将提供更好的性能。

老实说,我认为你必须有一些非常极端的速度要求才能成为你的瓶颈,但即使你这样做了,你也只能通过测试做出明智的决定

这里是一个开始,使用
find
/
re.findall
搜索一个字符串。不过,我怀疑这是否代表了您的用例,您需要确定要运行哪些查询并测试这些查询

% python -mtimeit "'<tags> <person1>dave jones</person1> <person2>ron matthews</person2> <person3>sally van heerden</person3> <place>tygervalley</place> <ocassion>shopping</ocassion> </tags>'.find('tygervalley')"
1000000 loops, best of 3: 0.279 usec per loop

% python -mtimeit "import re; re.findall('tygervalley', '<tags> <person1>dave jones</person1> <person2>ron matthews</person2> <person3>sally van heerden</person3> <place>tygervalley</place> <ocassion>shopping</ocassion> </tags>')"
100000 loops, best of 3: 2.65 usec per loop
%python-mtimeit“'dave jones ron matthews sally van heerden tygervalley shopping.”查找('tygervalley')”
1000000个循环,最好3个:每个循环0.279 usec
%python-mtimeit“导入re;re.findall('tygervalley','dave jones ron matthews sally van heerden tygervalley shopping')”
100000个循环,最好3个:每个循环2.65 usec

正如我所说,很难想象这种差异是程序中最重要的瓶颈。

将XML解析为一个高效的可搜索数据结构而不是担心如何直接搜索XML,这难道不是更有意义吗?您是否有一些极端的性能要求?如果没有,不要尝试优化不需要优化的内容。使用模块找出。@ThiefMaster性能要求并不极端,只是我必须从数千个图像文件中提取xml数据,然后将用户输入的术语与每个图像文件的xml数据进行匹配image@user1401950:那么,如果要进行文本搜索或语义搜索,您应该更清楚一点。因为如果你想进行XML感知处理,你应该使用XML解析器(不管你喜欢什么风格:DOM、SAX或pull),但是如果搜索正在进行,编译后的正则表达式可以存储在内存中。如果我们只使用一个指针,它看起来像,
(a | b | c | d | e | f | g)
,其中每个字母代表一个可能的匹配。在搜索开始之前,所有输入都必须为特殊字符转义,然后连接在一起形成指针。在XML中的每个字符上,正则表达式引擎都会检查是否有任何单词可能匹配,然后再继续下一个字符。简而言之,我几乎可以保证这会花费更长的时间。@kojiro etree.ElementTree用于解析xml,然后构建一棵树,您认为这是一个高效的可搜索数据结构吗?@user1401950请将此问题移至主评论线程,因为它与此答案并不相关。可能值得注意的是,
find
只查找第一个匹配项,而
re.findall()
将继续查找并返回所有匹配项的列表。所以你不能真正比较两者。