Ev.*_*nis 9 python performance time python-3.x
我的印象是startswith 必须比必须做更多检查in的简单原因更快(允许在字符串中的任何地方查找单词).但我怀疑,所以我决定.时间的代码如下所示,您可能会注意到我没有做太多时间; 代码很简单.intimeit
import timeit
setup1='''
def in_test(sent, word):
if word in sent:
return True
else:
return False
'''
setup2='''
def startswith_test(sent, word):
if sent.startswith(word):
return True
else:
return False
'''
print(timeit.timeit('in_test("this is a standard sentence", "this")', setup=setup1))
print(timeit.timeit('startswith_test("this is a standard sentence", "this")', setup=setup2))
Run Code Online (Sandbox Code Playgroud)
结果:
>> in: 0.11912814951705597
>> startswith: 0.22812353561129417
Run Code Online (Sandbox Code Playgroud)
所以startswith慢了两倍!我发现这个行为非常令人费解,因为我上面已经说过了.我对两个人的计时做错了还是in确实更快?如果是这样,为什么?
请注意,即使它们都返回,结果也非常相似False(在这种情况下,in如果它之前只是短路,则必须实际遍历整个传感器):
print(timeit.timeit('in_test("another standard sentence, would be that", "this")', setup=setup1))
print(timeit.timeit('startswith_test("another standard sentence, would be that", "this")', setup=setup2))
>> in: 0.12854891578786237
>> startswith: 0.2233201940338861
Run Code Online (Sandbox Code Playgroud)
如果我必须从头开始实现这两个函数,它将看起来像这样(伪代码):
startswith:开始比较的字母词来的信件句子,直到)字被耗尽(返回True逐个)或b)检查返回False(返回false)
in:呼吁startswith对每一个地方的首字母位置的字中可以找到句子.
我只是不明白..
只是要清楚,in并且startswith是不equivallent ; 我只是在谈论一个人试图找到的单词必须是字符串中的第一个.
这是因为您必须查找并调用方法.in是专门的,并通过较慢的字节码直接导致COMPARE_OP(调用cmp_outcome哪些,反过来,调用PySequence_Contains)str.startswith:
2 LOAD_ATTR 0 (startswith)
4 LOAD_FAST 1 (word)
6 CALL_FUNCTION 1 # the slow part
Run Code Online (Sandbox Code Playgroud)
更换in用__contains__,迫使函数调用那种情况下,几乎否定了速度差:
setup1='''
def in_test(sent, word):
if sent.__contains__(word):
return True
else:
return False
'''
Run Code Online (Sandbox Code Playgroud)
而且,时间安排:
print(timeit.timeit('in_test("this is a standard sentence", "this")', setup=setup1))
print(timeit.timeit('startswith_test("this is a standard sentence", "this")', setup=setup2))
0.43849368393421173
0.4993997460696846
Run Code Online (Sandbox Code Playgroud)
in 在这里获胜是因为它不需要经历整个函数调用设置,并且由于它提供的有利情况.
您正在比较字符串-vs上的运算符 - 属性查找和函数调用.第二个将有更高的开销,即使第一个需要很长时间的大量数据.
另外,你正在寻找第一个单词,所以如果它匹配,in将会看到与数据一样多的数据startswith().要查看差异,您应该看一个悲观的情况(找不到结果,或者在字符串的末尾匹配):
setup1='''
data = "xxxx"*1000
def ....
print(timeit.timeit('in_test(data, "this")', setup=setup1))
0.932795189000899
print(timeit.timeit('startswith_test(data, "this")', setup=setup2))
0.22242475600069156
Run Code Online (Sandbox Code Playgroud)