2012-11-07 5 views
1

파이썬을 사용하여 정렬 알고리즘 comparsion을 가진 프로그램을 작성 중입니다. 평균 정렬 시간을 측정하고 싶습니다. 첫 번째 측정에 문제가 있습니다.파이썬 : 평균 타이밍 처리, 첫 번째/두 번째는 훨씬 느림

이 :

for i in xrange(self.repeats): 
    # random list generator 
    data_orig = [random.randint(0, self.size - 1) for x in xrange(self.size)] 

    sorter = self.class_() 
    data = data_orig[:] 
    debug("%s for data size: %d, try #%d" % (sorter.__class__.__name__, self.size, i+1)) 
    t1 = time.clock() 
    sorter.sort(data) 
    t2 = time.clock() 
    debug("Took: %0.4fms, shifts: %d, comparisons: %d" % ((t2-t1)*1000.0, sorter.shifts, sorter.comps)) 

class_은 삽입 정렬 클래스에 대한 참조입니다. 내가 프로그램 첫 번째 결과는 다른 사람보다 더 큰 실행할 때마다 정렬 알고리즘 모든 시간 동안

InsertionSort for data size: 1000, try #1 
Took: 39.5341ms, shifts: 254340, comparisons: 255331 
InsertionSort for data size: 1000, try #2 
Took: 6.0765ms, shifts: 250778, comparisons: 251772 
InsertionSort for data size: 1000, try #3 
Took: 6.9946ms, shifts: 254189, comparisons: 255180 
InsertionSort for data size: 1000, try #4 
Took: 6.7421ms, shifts: 252162, comparisons: 253156 
InsertionSort for data size: 1000, try #5 
Took: 5.9584ms, shifts: 241412, comparisons: 242404 

: 크기 = 1000 5 반복 나는 다음과 같은 결과를 얻을 수 있습니다. 나는 PyPy로 실행한다. (파이썬에서는 괜찮은 것처럼 보이지만, 훨씬 느리다).

나는 단순히 첫 번째 결과를 ommit 수 있습니다 알고 있지만이 솔루션은

어떤 아이디어가 :-) 저를 만족하지 않는 이유는 무엇입니까?

답변

5

이것이 바로 PyPy의 요점입니다. 이 기능은 최적의 JIT (just-in-time) 컴파일러이므로 코드를 실행할수록 최적화 된 코드가됩니다. 처음 실행할 때 최적화를 수행 할 기회가 없으므로 결과가 느려집니다. 후속 실행은 처음 배운 교훈을 고려하므로 빠를 것입니다.

+3

. http://pypy.org/performance.html에서 : ** 서버와 같이 오랫동안 작동하는 것을 측정하는 경우 일반적으로 벤치 마크를 실행하기 전에 프로그램을 준비해야합니다 ** –

+0

CPython은 디스크 캐시에로드되는 내용, .py 파일 등 .pyc 파일로 컴파일되는 등의 이유로 처음에는 속도가 느려질 것입니다. "벤치마킹 전 워밍업"아이디어는 항상 필요합니다. PyPy가 더 많이 필요로한다는 사실은 아마도 보너스 혜택으로 계산되어야합니다. – abarnert

+0

기본적으로 처음 두 측정 값을 없애거나 내 프로그램을 워밍업하는 더 좋은 해결책이 있습니까? 나는 결과에 관심이있다. – Dave

관련 문제