php – 在Python中执行多个字符串替换的最快实现
发布时间:2020-12-13 13:11:22 所属栏目:PHP教程 来源:网络整理
导读:除了对字符串进行“替换”链接(即text.replace(a,b).replace(c,d).replace(e,f)…)之外,是否有任何推荐的方法进行多个字符串替换? 例如,你如何实现一个快速的函数,其行为类似于 Python中的PHP的htmlspecialchars? 我比较了(1)多个’替换’方法,(2)正则表达
除了对字符串进行“替换”链接(即text.replace(a,b).replace(c,d).replace(e,f)…)之外,是否有任何推荐的方法进行多个字符串替换?
例如,你如何实现一个快速的函数,其行为类似于 Python中的PHP的htmlspecialchars? 我比较了(1)多个’替换’方法,(2)正则表达式方法,和(3)马特安德森的方法. n = 10次运行,结果如下: 在100个字符上: TIME: 0 ms [ replace_method(str) ] TIME: 5 ms [ regular_expression_method(str,dict) ] TIME: 1 ms [ matts_multi_replace_method(list,str) ] 在1000个字符上: TIME: 0 ms [ replace_method(str) ] TIME: 3 ms [ regular_expression_method(str,dict) ] TIME: 2 ms [ matts_multi_replace_method(list,str) ] 在10000个字符上: TIME: 3 ms [ replace_method(str) ] TIME: 7 ms [ regular_expression_method(str,dict) ] TIME: 5 ms [ matts_multi_replace_method(list,str) ] 在100000个字符: TIME: 36 ms [ replace_method(str) ] TIME: 46 ms [ regular_expression_method(str,dict) ] TIME: 39 ms [ matts_multi_replace_method(list,str) ] 在1000000个字符上: TIME: 318 ms [ replace_method(str) ] TIME: 360 ms [ regular_expression_method(str,dict) ] TIME: 320 ms [ matts_multi_replace_method(list,str) ] 在3687809字符: TIME: 1.277524 sec [ replace_method(str) ] TIME: 1.290590 sec [ regular_expression_method(str,dict) ] TIME: 1.116601 sec [ matts_multi_replace_method(list,str) ] 因此,对Matt在相当大的输入字符串上击败多’替换’方法感到荣幸. 任何人都有想法在较小的字符串上击败它吗?
可能会出现以下情况?使用要替换的第一个“from”项目将文本拆分为多个部分,然后递归地将每个部分拆分为子部分,并使用下一个“from”项目进行替换,依此类推,直到您访问了所有替换项目为止.然后在递归函数完成时为每个“to”替换项加入.
也许有点难以绕过下面的代码(这对我来说,我写了它),但似乎按预期运行.我没有对它进行基准测试,但我怀疑它会相当快. def multi_replace(pairs,text): stack = list(pairs) stack.reverse() def replace(stack,parts): if not stack: return parts # copy the stack so I don't disturb parallel recursions stack = list(stack) from_,to = stack.pop() #print 'split (%r=>%r)' % (from_,to),parts split_parts = [replace(stack,part.split(from_)) for part in parts] parts = [to.join(split_subparts) for split_subparts in split_parts] #print 'join (%r=>%r)' % (from_,parts return parts return replace(stack,[text])[0] print multi_replace( [('foo','bar'),('baaz','foo'),('quux','moop')],'foobarbaazfooquuxquux') 对于: barbarfoobarmoopmoop (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |