2012-06-12 5 views
0

서로 다른 알고리즘을 테스트하고 있는데, timeit 모듈을 사용하여 성능을 측정합니다. 그러나 다른 반복은 훨씬 빨라 졌기 때문에 timeit.repeat() 반복의 첫 번째 만 실제로 계산 된 인 것으로 나타납니다. t.repeat 단일 알고리즘을 테스트 다음 결과이라도된다 (= 10, 번호 = 1 반복)Python timeit : 계산 된 결과 대신 캐시 된 결과?

[+]에 대한 결과 ...... : solve1 (함수 1/1)
[+] 가장 빠름 .......... : 0.00003099
[+] 가장 천천히 .......... : 32.38717794
[+] 평균 * ......... : 0.00003335 (평균 계산 된 최대 값/최대 값 없음)

첫 번째 결과는 완료하는 데 훨씬 더 많은 시간이 걸리므로 은 팀 eit.repeat() 루프는 어쨌든 루프의 이전 결과 인 반복의 캐시 된 결과를 사용합니다. 실제로 while 루프에서 timeit.repeat()를 사용하여 서로에 대해 알고리즘을 비교하면 퍼즐에 대한 해결책이 한 번만 계산됩니다.

[+] 결과가 ..... . : solve1 (function 1/3)
[+] 가장 빠름 .......... : 0.00003099
[+] 가장 느리게 .......... : 16.33443809
[+] 평균 * ......... : 0.00003263 (평균값 제외)

[+] 결과 : solve2 (기능 2/3)
[+] 가장 빠름 .......... : 0.00365305
[+] 가장 천천히 .......... : 0.02915907
[+] 평균 * ......... : 0.00647599 (평균. 계산 된 w/o 분/최대 값)

[+] 결과 : solve3 (기능 3/3)
[+] 가장 빠른 .......... : 0.00659299
[+] 가장 천천히 .......... : 0.02440906
[+] 평균 * ......... : 0.00717765 (평균 계산 된 최대 값/최대 값)

정말 이상한 점은 알고리듬의 상대 속도 ( )가 모든 알고리즘에서 일치한다는 것인데, 이는 모든 알고리즘이 자신의 결과를 계산한다는 것을 의미합니다 ( ). 중간 결과 (첫 번째 솔루션을 계산할 때 을 얻음)의 상당 부분이 여전히 파이썬 프로세서 인 에 의해 예약 된 캐시의 일부로 남아 있기 때문에 성능이 극단적으로 향상 되었습니까?

도움이나 의견을 보내 주시면 감사하겠습니다.

+1

코드를 표시하지 않았으므로 부분 결과를 캐싱하고 알지 못하는 것 같습니다. 구현이 매우 메모리 집약적이어서 첫 번째 반복이 나중에 반복되는 시스템 리소스를 요청하는 인터프리터의 오버 헤드를 지불 할 수도 있습니다. – msw

+0

코드가 없으면이 질문에 답할 수 없습니다. – msw

답변

1

메모리 할당이 문제라고 생각합니다.

파이썬 인터프리터는 메모리 풀을 가지고있다. 메모리 풀은 없다 (또는 거의?) 메모리 풀링으로 시작하지 않는다. 프로그램을 처음 실행 한 후 많은 양의 메모리가 (시스템에서) 할당되고 풀 (풀)로 할당 된 다음 풀에서 메모리를 가져 와서 시스템에서 메모리를 요청하는 것보다 훨씬 빠릅니다.

하지만 알고리즘이 많은 메모리를 소비하는 경우에만 의미가 있습니다.

+0

테스트 된 모든 알고리즘은 최소 메모리 요구 사항을 갖습니다. – user1450764

+0

예상 메모리 용량은 얼마입니까? – Marcus

+0

모든 알고리즘은 일정한 양의 공간/메모리를 사용합니다. 이들은 여러 로컬 검색 알고리즘의 구현입니다. solve1()은 'iterated local search'를 구현하고 solve2() 및 solve3()은 '시뮬레이트 된 어닐링'의 다양성을 구현합니다. – user1450764