본문 바로가기
Engineer/Juila

[Julia] 기본1 - 4. 함수 사용하기

by _제이빈_ 2021. 10. 11.

링크의 내용을 공부하며 제멋대로 번역한 내용입니다.

 

Juila는 JIT(Just-In-Time) 컴파일러라서 더 높은 효율을 내려면 컴파일을 미리해놓는것이 좋다. 그렇게 하려면, 함수로 만들어 놓으면 빠르다! 그럼 함수를 만드는 법을 알아보자.

 

BASIC FUNCTION 기본 함수

아래의 이차 급수(Quadratic Series)를 구하는 함수를 예로 들어 보자.

function sum_series(n)
	x = 0
    for k in 1:n
    	x = x + (1/k)^2
    end
    return x
end

99위 코드를 실행한  뒤 실행했던 REPL터미널에서 위 함수를 실행해 보자.

굳 잘 작동한다.


ARRAY FUNCTIONS AND THE DOT OPERATOR 어레이 함수와 닷연산

스칼라 값에만 적용하는 것이 아니라, 어레이에 함수를 적용할 수 있다. 이건 살짝 메트렙에서 따온 듯 하다.

따라해보자.

f(x) = 3x^3/(1+x^2)
x = [2\pi/n for n =1:30]
y = f.(x)

f라는 함수에 x변수를 정의(위에서 f(x)를 씀)하고 x로 이뤄진 식을 만들어 정의(3xblabla...)를 하면, f 자체를 함수로 사용할 수 있다. 여기서 놀라운 점은.... 3x^3따위의 손으로 풀던 수식과 같이 과감하게 곱셈기호를 없앨 수 있다. 물론, 실전에서는 무조건 곱셈기호를 사용할 거다. 오류를 방지하기 위해... 생각해보니 이거때매 디버깅좀 고생할 수 있겠다는 생각이 든다.

 

여하튼 이런 인라인 함수?가 꿀인건 아래와 같이 응용이 가능하다는 것이다.

y = sin.(x)
y = 2x.^2 + 3x.^5 - 2x^8
y = @. 2x^2 + 3x^5 - 2x^8

위 예시 3가지 중 아래 2가지는 메트렙이랑 너무 비슷...

 


PERFROMANCE TIP #1 퍼포먼스올리기 팁

 

효율적인 Julia 코드를 작성하기 위해서는 성능에 큰 영향을 미치는 것을 함수화 하는 것이다.
Julia의 JIT 컴파일러가 작동하는 방식 자체가 계속 컴파일을 하기 떄문에, 함수로 정의해놓는다면 여러번 컴파일을 하는 비효율을 막을 수 있다.

precompile(sum_series, (int,))

혹은 JIT 컴파일러에 입력 변수 유형을 알림으로써 함수를 미리 컴파일(precompile할 수 있다. 이건 또 C랑 같다. 예를 들어 위의 예에서는 변수 n이 정수이기 때문에 JIT 컴파일러에 알려주고 미리 컴파일 하는 것이다. 프리컴파일이 어떻게 사용하는 걸까 좀 찾아보니까 실제로 프로젝트를 작성해보면서 이해해야겠다는 결론이 낫다. 

 


MODULES 모듈

 

프로젝트를 관리하려면 모듈이 빠질 수 없다. (한 스크립트에 다 쓸수는 없다!) 예를 들면 이렇게 쓴다.

#myModule.jl
module myModule

export sum_series

function sum_series(n)
	x=0
    for k in 1:n
    	x = x (1/k)^2
    end
    return x
end

end

그리고 다른 스크립트내에서 이렇게 불러다 쓴다.

include("myModule.jl")

모듈 내 함수 호출은 이렇게 한다.

x = myModule.sum_series(100000)
반응형

댓글