2016-09-18 4 views
0

setlist에 대한 in 문장의 성능을 평가하려고합니다. 나는 모듈 time으로 할 수 있다는 것을 알고 있지만, timeit 모듈을 시험해보고 싶다. 그래서 내 코드는 다음과 같습니다목록의 진술을 평가하고 timeit 모듈을 통해 설정 한 이상한 결과

from timeit import Timer 


def func_to_test(val, s): 
    return val in s 

if __name__ == "__main__": 
    val = 346 
    n = 100000 
    s = set([x for x in range(n)]) 
    l = [x for x in range(n)] 
    list_timer = Timer("func_to_test(%s, %s)" % (val, l), "from __main__ import func_to_test") 
    set_timer = Timer("func_to_test(%s, %s)" % (val, s), "from __main__ import func_to_test") 
    print(list_timer.timeit(100)) 
    print(set_timer.timeit(100)) 

출력은 다음과 같습니다

0.1953735960000813 
0.6675883569996586 

그러나 list에 대한 이유를 inset보다 더 나은 성능 "을 가지고"? 나는 그렇지 않다는 것을 알고 있지만, 왜 timeit 모듈로 이러한 결과가 나오는지?

+0

큰 n을 사용하면이 경우 집합의 상수 계수가 다소 높아지므로 l보다 느리게 성장하지 않습니다. 작은 n – Natecat

답변

2

설정 진술 func_to_test을 가져 오지만 다른 작업은 수행하지 않습니다. 따라서 실제 타이밍 테스트는 멤버십 테스트에 소요되는 시간뿐 아니라 목록 (목록 테스트 용) 또는 목록 세트 (설정 테스트 용)를 만드는 데 걸리는 시간도 타이밍을 지정합니다. setup 문에서 반복 가능을 생성하면 문제가 사라집니다.

>>> import timeit 
>>> timeit.timeit('346 in s', setup='s=list(range(100000))') 
9.412489017458922 
>>> timeit.timeit('346 in s', setup='s=set(list(range(100000)))') 
0.08872845571155352 
>>> timeit.timeit('346 in s', setup='s=set(range(100000))') 
0.09335872296618675 
+0

감사합니다. 정확한 타이밍을 지적합니다. 그런데 왜 내 코드가 그러한 결과를 산출합니까? – Litwisha

+0

@Litwisha - 회원 코드를 테스트하는 데 걸리는 시간뿐만 아니라 목록을 만들고 멤버를 테스트하거나 목록을 만들고 집합을 만들고 멤버십을 테스트하는 데 소요되는 시간을 코드에서 확인하기 때문에 – TigerhawkT3

+0

그것은 나에게 조금 이상합니다. list와 set의 생성은'func_to_test'가 아니라 메인 블록에서 평가되기 때문에. – Litwisha