[Julia] Julia vs Julia numpy with PyCall vs python numpy performace 비교

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

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다