Python 优化调用'的运行时;在';在同一根弦上多次
在查找子字符串时,中的Python 优化调用'的运行时;在';在同一根弦上多次,python,Python,在查找子字符串时,中的运算符是单个调用的首选。看起来也是 如果我想确定一个字符串中是否存在多个子字符串,如下所示: if 'dog' in str: # .... if 'cat' in str: # .... if 'frog' in str: # .... 这将是3n运行时,这是大量重复的工作。 是否有一种方法可以在或其他可用的库中优化,这将是一种更快的选择?#编辑 ==================================================
运算符是单个调用的首选。看起来也是
如果我想确定一个字符串中是否存在多个子字符串,如下所示:
if 'dog' in str:
# ....
if 'cat' in str:
# ....
if 'frog' in str:
# ....
这将是3n运行时,这是大量重复的工作。
是否有一种方法可以在
或其他可用的库中优化,这将是一种更快的选择?#编辑
==============================================================
a_list = re.sub("[^a-zA-Z ]","",s).split()#4957 words (lorum ipsum generated)
search_space = set("dog cat fish bear walrus".split())
def joranbeasley():
return search_space.intersection(a_list)
def stephenPochmann():
for needle in search_space:
if needle in s: print needle
import timeit
print "Stephen Timeit:",timeit.timeit(stephenPochmann,number=1000)
print "joran Timeit:",timeit.timeit(joranbeasley,number=1000)
set(["dog","cat","frog"]).intersection(my_str.split())
结果
Stephen Timeit: 0.126952238343
joran Timeit: 0.148540107751
===============================================================
a_list = re.sub("[^a-zA-Z ]","",s).split()#4957 words (lorum ipsum generated)
search_space = set("dog cat fish bear walrus".split())
def joranbeasley():
return search_space.intersection(a_list)
def stephenPochmann():
for needle in search_space:
if needle in s: print needle
import timeit
print "Stephen Timeit:",timeit.timeit(stephenPochmann,number=1000)
print "joran Timeit:",timeit.timeit(joranbeasley,number=1000)
set(["dog","cat","frog"]).intersection(my_str.split())
可能会给你你需要的很难说,而且应该足够快
如果字符串使用的分隔符不是空格,则可能需要传递一个参数以使用分隔符(“;”或其他内容)进行拆分
您可能还需要清理输入以删除标点符号之类的内容
my_cleaned_string = re.sub("[^a-zA-Z]","",my_str)
与@StephenPochmans相比,如果我稍微改变一下(即我不需要每次都分裂)
结果如何
c:\py_exp>python test_benchmark.py
Stephen Timeit: 0.356363602542
joran Timeit: 0.166205366392
Stephen Timeit: 0.126952238343
joran Timeit: 0.148540107751
在将@StephenPochmans改为使用字符串而不是列表后,他是对的,而且速度确实更快。。。我很快会在回答的顶部澄清这一点
def stephenPochmann():
for needle in search_space:
if needle in s: print needle
以下是结果
c:\py_exp>python test_benchmark.py
Stephen Timeit: 0.356363602542
joran Timeit: 0.166205366392
Stephen Timeit: 0.126952238343
joran Timeit: 0.148540107751
如果你有很多单词,你应该考虑移动到一个用于在文本中搜索多个单词的算法构建。
最流行的是Aho–Corasick算法(),您可以在Python中找到许多实现。
这只是解释该算法及其实现的众多教程之一:如果其中任何一个在字符串中,您是否也在做同样的事情?在一般情况下很难回答重复的问题-您到底想实现什么O(3n)
实际上就是O(n)
,而且对于较小的n
,任何其他尝试都可能较慢。您是否遇到了实际的性能问题并将其分析为这个瓶颈?@StephenTG理想情况下,我可以为不同的应用程序插入不同的操作matches@user4998087这并没有解决我的问题!例如,如果您有一个不变的长字符串,并且希望快速检查该字符串是否包含给定的子字符串,则处理该任务的方式可能与计算字符串中某个子字符串的出现次数完全不同。假设以其他方式分隔的字(使用常规分隔符),这仍然是一个很好的答案,但是split
需要一个参数。@两位炼金术士:为什么在这里使用split
参数?求交运算符是O(n)平均值,最坏情况是O(n^2)…@Matthias我不得不重新阅读它。。。他说如果你的定界符不是空空格,是的,很抱歉搞混了。如果您的单词由--
或其他东西(而不是空格)分隔,您必须告诉split