스펙상 10000000 값 내에서 4초 이내에 답이 나와야 한다. 이에 대해서 현재의 병목지점에 대해 profiling 을 해 보았다.
~cpp
C:\WINDOWS\system32\cmd.exe /c python SummationOfFourPrimes.py
input number : 10000
[2, 2, 23, 9973]
21065 function calls in 6.387 CPU seconds
Random listing order was used
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.075 0.075 1.201 1.201 summationoffourprimes.py:13(createList)
0 0.000 0.000 profile:0(profiler)
1 5.103 5.103 6.387 6.387 summationoffourprimes.py:88(main)
1 0.000 0.000 1.201 1.201 summationoffourprimes.py:8(__init__)
9999 1.126 0.000 1.126 0.000 summationoffourprimes.py:18(isPrimeNumber)
1 0.000 0.000 0.000 0.000 summationoffourprimes.py:24(getList)
11061 0.083 0.000 0.083 0.000 summationoffourprimes.py:79(selectionFour)
1 0.000 0.000 6.387 6.387 <string>:1(?)
~cpp
C:\WINDOWS\system32\cmd.exe /c python SummationOfFourPrimes.py
input number : 50000
[2, 2, 3, 49993]
60269 function calls in 24.926 CPU seconds
Random listing order was used
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.428 0.428 19.348 19.348 summationoffourprimes.py:13(createList)
0 0.000 0.000 profile:0(profiler)
1 5.492 5.492 24.923 24.923 summationoffourprimes.py:88(main)
1 0.000 0.000 19.348 19.348 summationoffourprimes.py:8(__init__)
49999 18.920 0.000 18.920 0.000 summationoffourprimes.py:18(isPrimeNumber)
1 0.000 0.000 0.000 0.000 summationoffourprimes.py:24(getList)
10265 0.083 0.000 0.083 0.000 summationoffourprimes.py:79(selectionFour)
1 0.003 0.003 24.926 24.926 <string>:1(?)
Hit any key to close this window...
대부분의 시간은 소수테이블을 작성하는 부분이 된다. 그래서 이 부분에 대해서
PrimeNumber를 참고, 최적화된 알고리즘으로 수정하였다. 그리고 역시 psyco 를 이용하였다. 그 결과, 10000000 기준 10초. 기존 알고리즘의 경우 50000번 기준 24초 이상.
~cpp
C:\WINDOWS\system32\cmd.exe /c python SummationOfFourPrimes.py
input number : 10000
[2, 2, 23, 9973]
11067 function calls in 5.417 CPU seconds
Random listing order was used
ncalls tottime percall cumtime percall filename:lineno(function)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.000 0.000 summationoffourprimes.py:48(getList)
1 0.000 0.000 5.417 5.417 <string>:1(?)
1 0.000 0.000 0.013 0.013 summationoffourprimes.py:36(createList)
1 0.000 0.000 0.013 0.013 summationoffourprimes.py:31(__init__)
11061 0.094 0.000 0.094 0.000 summationoffourprimes.py:103(selectionFour)
1 5.309 5.309 5.416 5.416 summationoffourprimes.py:112(main)
1 0.013 0.013 0.013 0.013 summationoffourprimes.py:8(prime2)
Hit any key to close this window...
~cpp
C:\WINDOWS\system32\cmd.exe /c python SummationOfFourPrimes.py
input number : 50000
[2, 2, 3, 49993]
10271 function calls in 7.878 CPU seconds
Random listing order was used
ncalls tottime percall cumtime percall filename:lineno(function)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.000 0.000 summationoffourprimes.py:48(getList)
1 0.002 0.002 7.878 7.878 <string>:1(?)
1 0.002 0.002 0.090 0.090 summationoffourprimes.py:36(createList)
1 0.000 0.000 0.090 0.090 summationoffourprimes.py:31(__init__)
10265 0.098 0.000 0.098 0.000 summationoffourprimes.py:103(selectionFour)
1 7.688 7.688 7.876 7.876 summationoffourprimes.py:112(main)
1 0.088 0.088 0.088 0.088 summationoffourprimes.py:8(prime2)
Hit any key to close this window...
최적화 이후 50000번 기준으로는 병목에 대한 변별력이 없다.
여기서 selectionFour 의 경우는 percall 에 걸리는 시간은 적다. 하지만, call 횟수 자체가 470988 번으로 많다. 이 부분에 대해서 일종의 inlining 을 하였다.
~cpp
C:\WINDOWS\system32\cmd.exe /c python SummationOfFourPrimes.py
input number : 1000000
(2, 2, 13, 999983)
6 function calls in 16.671 CPU seconds
Random listing order was used
ncalls tottime percall cumtime percall filename:lineno(function)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.000 0.000 summationoffourprimes.py:48(getList)
1 13.736 13.736 16.540 16.540 summationoffourprimes.py:121(main2)
1 0.067 0.067 2.804 2.804 summationoffourprimes.py:36(createList)
1 2.738 2.738 2.738 2.738 summationoffourprimes.py:8(prime2)
1 0.131 0.131 16.671 16.671 <string>:1(?)
1 0.000 0.000 2.804 2.804 summationoffourprimes.py:31(__init__)
Hit any key to close this window...
10000000 건에 대해서는 7.49 초 기록 (profiler 를 이용할 경우 속도저하가 있기 때문에 profiler 를 끄고 psyco 만으로 실행)