Pi값을 구하는 기능을 줄리아에서 numy를 사용했을 때, 줄리아로 구현 했을 때, 파이썬에서 했을 때 성능을 비교 한다.
Julia : v1.2.0
python : v3.7
https://frhyme.github.io/python-lib/python_interface_to_julia/ 사이트의 내용을 보고 참조를 했는데 n 값은 최대 15까지 가능 하며 이 이상 넘어 가면 무한대가 나오기 때문에 15까지 한다. 참조 사이트에서는 9 까지만 시행 했고 코드를 다시 작성하여 테스트 한 결과는 성능은 (1) 순수 줄리아 코드 > (2) 벡터라이즈드 줄리아 코드 > (3) 파이썬 코드 > (4) 줄리아에서 numpy 사용 순으로 나타 난다.
위 링크에서 비교한 성능 수치는 잘 못된 부분이 있느데 function 을 선언하고 바로 이어서 실행하는 데 까지 걸린 시간을 측정 했는데 이를 1) function 선언, 2) 최초 function 실행시 컴파일 되므로 먼저 한 번 실행후 3) 다시 function을 실행하는데 걸리는 시간을 측정 하는 것이 옳다.
아래 줄리어 및 파이썬 코드를 참조
줄리아 코드
using PyCall
@pyimport numpy
function compute_pi1(n=10)
r = numpy.sum(numpy.array([ 1/(16^k)*( 4/(8*k+1) - 2/(8*k+4) - 1/(8*k+5) - 1/(8*k+6)) for k in range(0, stop=n-1)]))
# println(r)
end
function compute_pi1_1(n=10)
k = numpy.array([k for k in range(0, stop=n-1)])
r = numpy.sum(@. 1/(16^k)*( 4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6)))
# println(r)
end
function compute_pi2(n=10)
r = 0
for k in 0:n-1
r+= 1/(16^k)*( 4/(8k+1) - 2/(8k+4) - 1/(8k+5) - 1/(8k+6))
end
# println(r)
end
function compute_pi3(n=10)
k = Float64[0:n-1;]
r = sum(@. 1/(16^k)*(4/(8k+1)-2/(8k+4)-1/(8k+5)-1/(8k+6)))
# println(r)
end
compute_pi1(15)
compute_pi1_1(15)
compute_pi2(15)
compute_pi3(15)
println("=======P1===========")
@time begin
compute_pi1(15)
end
@time begin
compute_pi1_1(15)
end
println("=======P2===========")
## pure julia 속도
@time begin
compute_pi2(15)
end
println("=======P3===========")
## julia 속도
@time begin
compute_pi3(15)
end
줄리아 실행결과
=======P1===========
0.000104 seconds (52 allocations: 3.156 KiB) <-- python numpy사용 - for loop문
0.000129 seconds (85 allocations: 3.672 KiB) <-- python numpy사용 - 벡터라이즈
=======P2===========
0.000004 seconds (4 allocations: 160 bytes) <-- 순수줄리아
=======P3===========
0.000006 seconds (7 allocations: 592 bytes) <-- 벡터라이즈드 줄리아
파이썬 코드
import numpy
import time
def compute_pi(n=10):
return numpy.sum(numpy.array([ 1./(16^k)*( 4./(8.*k+1.) - 2./(8*k+4.) - 1./(8*k+5.) - 1./(8*k+6)) for k in range(0, n)]))
compute_pi(15)
start = time.time()
compute_pi(15)
stop = time.time()
print("%.8f" % (stop1 - start1,))
파이썬 실행결과
0.00005984