2016-12-06 154 views
4

这里有两个函数可以完全相同,但是有谁知道为什么使用count()方法的方法比另一个方法快得多? (我的意思是它的工作原理又是如何构建?)为什么count()方法比for循环python更快

如果可能的话,我想比一个更容易理解的答案怎么在这里找到:Algorithm used to implement the Python str.count function 或什么的源代码:https://hg.python.org/cpython/file/tip/Objects/stringlib/fastsearch.h

def scoring1(seq): 
    score = 0 
    for i in range(len(seq)): 
     if seq[i] == '0': 
      score += 1  
    return score 

def scoring2(seq): 
    score = 0 
    score = seq.count('0') 
    return score 

seq = 'AATTGGCCGGGGAG0CTTC0CTCC000TTTCCCCGGAAA' 
# takes 1min15 when applied to 100 sequences larger than 100 000 characters 
score1 = scoring1(seq) 
# takes 10 sec when applied to 100 sequences larger than 100 000 characters 
score2 = scoring2(seq) 

非常感谢您的回复

+14

简短的回答是因为一群非常聪明的人从python发布以来一直在优化内建'count()'功能 –

+0

你试过这个电脑吗?我的显然是比你快100-200倍。另外,为什么unpythonic索引循环?你**试图让它变慢吗? –

+1

[用于实现Python str.count函数的算法]的可能重复(http://stackoverflow.com/questions/16806972/algorithm-used-to-implement-the-python-str-count-function) –

回答

3

@CodeMonkey已经给出了答案,但它可能是有趣的,你的第一个功能可以改进,使之运行速度更快约20%:

import time, random 

def scoring1(seq): 
    score=0 
    for i in range(len(seq)): 
     if seq[i]=='0': 
      score+=1  
    return score 

def scoring2(seq): 
    score=0 
    for x in seq: 
     score += (x =='0')  
    return score 

def scoring3(seq): 
    score = 0 
    score = seq.count('0') 
    return score 

def test(n): 
    seq = ''.join(random.choice(['0','1']) for i in range(n)) 
    functions = [scoring1,scoring2,scoring3] 
    for i,f in enumerate(functions): 
     start = time.clock() 
     s = f(seq) 
     elapsed = time.clock() - start 
     print('scoring' + str(i+1) + ': ' + str(s) + ' computed in ' + str(elapsed) + ' seconds') 

test(10**7)  

典型输出:

scoring1: 5000742 computed in 0.9651326495293333 seconds 
scoring2: 5000742 computed in 0.7998054195159483 seconds 
scoring3: 5000742 computed in 0.03732172598339578 seconds 

前两种方法都被内置的count()吹走。

道德故事:当您使用已优化的内置方法的而不是时,您需要优化自己的代码。

+0

下次使用'timeit' –

+0

@Chris_Rands这是个好主意 - 但我有时候会用'时间',如果我对球场的形象感到满意的话。 –

4

因为count是在底层本机实现中执行的。 for循环以较慢的解释代码执行。

相关问题