- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近为问题“A Regex that will never be matched by anything ”( my answer here ,请参阅更多信息)计时了一堆正则表达式。
然而,在我测试之后,我注意到正则表达式 'a^'
和 'x^'
花费了截然不同的时间来检查,尽管它们应该是相同的. (我什至只是偶然地切换了角色。)这些时间如下。
In [1]: import re
In [2]: with open('/tmp/longfile.txt') as f:
...: longfile = f.read()
...:
In [3]: len(re.findall('\n',longfile))
Out[3]: 275000
In [4]: len(longfile)
Out[4]: 24733175
...
In [45]: %timeit re.search('x^',longfile)
6.89 ms ± 31.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [46]: %timeit re.search('a^',longfile)
37.2 ms ± 739 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [47]: %timeit re.search(' ^',longfile)
49.8 ms ± 844 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
在线测试(仅前 50 行)显示了相同的行为(1441880 步和 ~710 毫秒对比仅 40858 步和~113 毫秒):https://regex101.com/r/AwaHmK/1
Python 在这里做了什么使得 'a^'
比 'x^'
花费的时间长得多?
只是为了看看 timeit
或 IPython 中是否发生了什么,我自己写了一个简单的计时函数,一切都检查出来了:
In [57]: import time
In [59]: import numpy as np
In [62]: def timing(regex,N=7,n=100):
...: tN = []
...: for i in range(N):
...: t0 = time.time()
...: for j in range(n):
...: re.search(regex,longfile)
...: t1 = time.time()
...: tN.append((t1-t0)/n)
...: return np.mean(tN)*1000, np.std(tN)*1000
...:
In [63]: timing('a^')
Out[63]: (37.414282049451558, 0.33898056279589844)
In [64]: timing('x^')
Out[64]: (7.2061508042471756, 0.22062989840321218)
我还在 IPython 之外的标准 3.5.2
shell 中复制了我的结果。所以奇怪的是不局限于 IPython 或 timeit
。
最佳答案
如链接问题中所述,此正则表达式会扫描整个文本。
这里看到的时间差异只是因为“a”在英文文本中是一个很常见的字母,而您使用了可读数据。所以,如果你研究正则表达式引擎是如何工作的,你就会明白:使用模式 a^
会导致更多的延迟,因为在第一个“a”上找到试探性匹配,然后被拒绝。该引擎有两个“读取头”,它们都从左向右移动——一个在字符串中移动,另一个在正则表达式模式中移动。将 a^
模式与您选择的人类可读数据结合使用,正则表达式引擎必须做更多的工作。由于“x”在语料库中是一个不常见的字母,使用模式 x^
浪费的时间更少 - 文本中的更多位置可以立即被拒绝。
e^
会比 a^
更慢,因为“e”在英语中出现的频率更高)。a^
和 x^
模式的表现将相似。总而言之,考虑到正则表达式的更广泛上下文,这两个“等效”的永不匹配的正则表达式模式 a^
和 x^
实际上并不那么等效引擎的内部工作原理和选择的测试数据。
关于python - "equivalent"永不匹配的正则表达式的时间截然不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47118220/
我需要一个正则表达式,它只会选择那些不以 .png 或 .css 等特定扩展名结尾的 URL 字符串。 我测试了以下内容: 1)这个使用负回顾: (? SetHandler "proxy:un
我似乎无法确切地掌握名称的等效性。我很确定我的结构已经下降。我的教授给出的一个例子是: Type TI=integer Type TTI=TI a=integer b=TTI f= ref
我最近为问题“A Regex that will never be matched by anything ”( my answer here ,请参阅更多信息)计时了一堆正则表达式。 然而,在我测试
Clojure 为 提供方法懒惰评估 (无限)序列中的值。有了这个,值只会在它们被实际消耗时计算。 一个重复元素的无限序列示例: (take 3 (repeat "Hello StackOverflo
如果我使用文本文件在 Solr/Lucene 中定义同义词,如下所示: foo, bar, goo abc, bar, xyz 字bar在两条线上。 这是否意味着 Solr 将所有术语都视为同义词,因
在 Xcode 中,当您设置键盘快捷键时,有一个很好的控件可以帮助您: 我觉得我可以通过扩展 NSTextField 来重现它,但我也觉得这可能是其他人以前做过的事情。我做了一些搜索,但没有找到任何结
我对汇编语言有点陌生,很难理解术语“字节等效”。 它用于以下上下文:- MOV 指令有时会引起歧义。例如,查看以下语句: MOV EBX, [MY_TABLE] ; Effective Addre
这是一个“软性问题”,因此,如果此发布地点不合适,请告诉我。 本质上,我想知道如何谈论在某种意义上“等效”而在另一些意义上“不同”的算法。 这是一个玩具示例。假设我们得到了一个长度为list的数字n的
我(在 Protege 中)定义了一个 Missing 类,它相当于 ((not (atHome value 30)) and (not (atWork value 30)))and (not (on
我正在处理一个烦人的数据库,其中一个字段包含真正应该存储在两个单独字段中的内容。因此该列存储的内容类似于“第一个字符串~@~第二个字符串”,其中“~@~”是分隔符。 (再说一次,我没有设计这个,我只是
在 Django 中,这两个是等价的吗? Cars.objects.exclude(brand='mercedes').exclude(year__lte=2000) 和 Cars.objects.e
此代码行选择任何类名不是“id”和“quantity”的 div 内的所有子输入:: $("div.item > div:not(.id,.quantity) > :input").live("key
在 Vue 1.x 中,我使用以下指令直接选择一个节点。 然后: this.$els.visibleColumns 是否有 Vue 2.x 方法来做到这一点? 最佳答案 当然,所以它已被 ref/$
我在underscore.js源码中看到了这段代码: if ((!a && b) || (a && !b)) return false; 这是否等同于以下内容? if (a ^ b) return f
我需要一些关于批处理文件中 grep -v Wildcard 和 grep -o 的等效代码的帮助。 这是我在 shell 中的代码。 result=`mysqlshow --user=$dbUser
我试图在 SQL 中找到等同于 IN\NOT 的 ElasticSearch 查询。 我知道我们可以使用带有多个 OR 的 QueryString 查询来获得相同的答案,但最终会得到很多 OR。 谁能
On a separate post , 我在帮忙George Edwards使用 BLE API 分解一些代码. 我很确定我发布的代码(使用分解模板)与原始代码相同。但是当 George 将它发送到
是否有办法“模仿”background-size:cover; 的行为? (参见 http://www.w3schools.com/cssref/playit.asp?filename=playcss
我正在使用 Qt。我需要直接向我的打印机写入一些文本。在 Windows 上,我可以使用 winapi OpenPrinter 和 WritePrinter 执行此操作,但我需要此代码才能在 linu
我搜索过并使用过 UIDevice.currentDevice().instancesRespondToSelector(Selector("userInterfaceIdiom")) 但对我不起作用
我是一名优秀的程序员,十分优秀!