f_
frhyme.code
•others•โฑ ์•ฝ 24๋ถ„ ์†Œ์š”

Julia!!

what is julia?

  • julia๋ผ๋Š” ์–ธ์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ „์— ๋“ค์–ด๋ณธ ์ ์ด ์žˆ๊ธฐ๋Š” ํ•ด์š”. ์™ธ๊ตญ์— ๊ณ„์‹  ์‚ฐ์—…๊ณตํ•™ ๋ถ„์•ผ(์ •ํ™•ํžˆ๋Š” ์ตœ์ ํ™”)์˜ ๊ต์ˆ˜๋‹˜์˜ ๋ธ”๋กœ๊ทธ์—์„œ ์˜ˆ์ „์— ๋“ค์–ด๋ณธ ์ ์€ ์žˆ์—ˆ๋Š”๋ฐ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์•˜์–ด์š”.
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š”, 1) ์ด๋ฏธ ๋‚˜๋Š” ํŒŒ์ด์ฌ์„ ๋ฐฐ์šฐ๊ณ  ์žˆ์—ˆ๊ณ , 2) ํŒŒ์ด์ฌ์— ์ˆ™๋‹ฌํ•ด ์žˆ๋‹ค๊ณ  ๋ณด๊ธฐ ์–ด๋ ค์› ๊ณ , 3) ์‚ฌ์†Œํ•˜์ง€๋งŒ array indexing์ด 0์ด ์•„๋‹Œ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ณ„๋กœ์˜€๊ณ , ์ •๋„๊ฐ€ ์žˆ์—ˆ๋„ค์š”. ๋ฌผ๋ก  ๊ธฐ์–ต์€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค๋งŒ.
  • ์•„๋ฌดํŠผ, julia๋ผ๋Š” ์–ธ์–ด๋Š” MIT์—์„œ ๋งŒ๋“  ์–ธ์–ด๊ณ , ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Julia is a high-level general-purpose[12] dynamic programming language that was originally designed to address the needs of high-performance numerical analysis and computational science

  • ์ž…๋‹ˆ๋‹ค. ์ผ๋‹จ high-level์ด๋ผ๋Š” ๊ฒƒ์€ ํŒŒ์ด์ฌ์ด๋‚˜, R์ฒ˜๋Ÿผ ๋‚˜๋ฆ„ ์ž์—ฐ์–ด์— ๊ฐ€๊น๊ฒŒ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ฃ (์–ด์…ˆ๋ธ”๋ฆฌ, c์ฒ˜๋Ÿผ ์ปดํ“จํ„ฐ์— ๊ฐ€๊น๊ฒŒ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ€๊น๊ฒŒ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค).
  • ๋˜ํ•œ dynamic programming์ด๋ผ๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด type์„ compile๋ ˆ๋ฒจ์—์„œ ์žก๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด๋ฉด ์•„๋ž˜ ์ฝ”๋“œ์—์„œ c์—์„œ๋Š” ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ํ•จ๊ป˜ ์„ ์–ธํ•ด์ค€ ๋ฐ˜๋ฉด, python์—์„œ๋Š” ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์„ ์–ธํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰ ๋™์ ์œผ๋กœ ํƒ€์ดํ•‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .
int a = 10;//c์—์„œ๋Š” ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ํ•จ๊ป˜ ์„ ์–ธํ•ด์ค˜์•ผํ•จ 
a = 10 ## python์—์„œ๋Š” ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ํ•จ๊ป˜ ์„ ์–ธ๋  ํ•„์š”๊ฐ€ ์—†์Œ. 
  • ์ €๋Š” python๊ฐ™์€ ์–ธ์–ด์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํƒ€์ž…์ด ๋Ÿฐํƒ€์ž„์‹œ์— ๋ฐ”๋€” ์ˆ˜ ์žˆ๋„๋ก ์„ธํŒ…๋˜์–ด ์žˆ์–ด์„œ ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ๋ฐ–์— ์—†๋‹ค, ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, julia์˜ ๊ฒฝ์šฐ๋Š” python๊ฐ™์€ ์–ธ์–ด์˜ ๊ฐ•์ ์ธ high-level interface๋ฅผ ๊ฐ€์ง€๋ฉด์„œ ์†๋„๋„ ๋งค์šฐ ๋น ๋ฅด๋‹ค ๋ผ๋Š” ๊ฒƒ์ด์ฃ โ€ฆ..์Šค๊ณ ์ดโ€ฆ.

  • ์‹ค์ œ๋กœ julia performance benchmark๋ฅผ ๋ณด๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์—†์„๋งŒํผ ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ y์ถ•์€ exponential์ด๊ธฐ ๋•Œ๋ฌธ์—, julia์˜ ๊ฒฝ์šฐ fibonacci recursion๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” python์— ๋น„ํ•ด์„œ 100๋ฐฐ ์ •๋„ ๋น ๋ฅด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(memoization๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ๋Œ๋ฆฐ ๊ฒƒ์ด ์•„๋‹๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค๋งŒ. ๋ฒค์น˜๋งˆํฌ๋Š” ์ œ๊ฐ€ ๋‚˜์ค‘์— ๋”ฐ๋กœ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

install it

  • ์•„๋ฌดํŠผ ๋ง์ด ๊ธธ์—ˆ๊ณ  ์„ค์น˜ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

julia on cloud

  • ์„ค์น˜ํ•˜๊ธฐ ๊ท€์ฐฎ์œผ์‹  ๋ถ„๋“ค์€ ์—ฌ๊ธฐ์—์„œ ํด๋ผ์šฐ๋“œ ์ƒ์—์„œ ์ฅด๋ฆฌ์•„๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ, ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ์ €๋Š” ๋งค์šฐ ๋А๋ ค์„œ ๊ทธ๋งŒ๋’€์Šต๋‹ˆ๋‹ค.

install julia

  • julia download์—์„œ ์„ค์น˜ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋งฅ์„ ์”๋‹ˆ๋‹ค.
  • ๋ณดํ†ต ์„ค์น˜ํ•˜๊ณ  ๋‚˜๋ฉด ์ž๋™์œผ๋กœ .bash_profile์— ๋“ฑ๋ก๋˜๋Š”๋ฐ, julia์˜ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š์•„์„œ ์•„๋ž˜ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.
# julia added
 export PATH="/Applications/Julia-1.0.app/Contents/Resources/julia/bin:$PATH"
  • ์ด์ œ ํ„ฐ๋ฏธ๋„์—์„œ julia๋ฅผ ์น˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ž˜ ๋ฉ๋‹ˆ๋‹ค.
MDOM14110-2:~ frhyme$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.0 (2018-08-08)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia>

install julia pro

  • julia pro๋Š” python์—์„œ ์•„๋‚˜์ฝ˜๋‹ค์™€ ์œ ์‚ฌํ•œ ๋А๋‚Œ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

  • ํŠนํžˆ, jupyter notebook๋“ฑ๊ณผ ์—ฐ๋™๋„ ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์„œ, ์ผ๋‹จ์€ ์ด ์•„์ด๋ฅผ ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ julia๋ฅผ ์„ค์น˜ํ•˜๋ฉด jupyter notebook๊ณผ ์—ฐ๋™ํ•˜๋ ค๋ฉด ์กฐ๊ธˆ ๊ท€์ฐฎ์€ ์ ๋“ค์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

  • ์ œ๊ฐ€ python3์„ ์„ค์น˜ํ•˜๊ณ  library๋ฅผ ์ด๊ฒƒ์ €๊ฒƒ ์„ค์น˜ํ•˜๋‹ค๊ฐ€ ๋””ํŽœ๋˜์‹œ ๋ฌธ์ œ๋•Œ๋ฌธ์— ํž˜๋“ค์—ˆ๋˜ ๊ฒฝํ—˜์„ ์•„๋‚˜์ฝ˜๋‹ค๊ฐ€ ๋‹ค ํ•ด๊ฒฐํ•ด์ค€ ๊ธฐ์–ต์ด ์žˆ์–ด์„œ, ๊ฐ€๋Šฅํ•˜๋ฉด ๋ฌถ์—ฌ์ง„ ํ˜•ํƒœ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฑธ ์ข‹์•„ํ•ด์š”.

  • ์„ค์น˜๋Š” ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์„ค์น˜ํ•˜๊ณ  ๊ทธ๋‹ค์Œ์— jupyter notebook์—์„œ ์ฝ˜์†”์„ julia๋กœ ๋ณ€๊ฒฝํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋˜ํ•œ, julia ์ง„์˜์—์„œ๋Š” juno๋ผ๋Š” IDE๋ฅผ ํ™๋ณดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค๋งŒ, ์ €๋Š” ํ™˜์˜ํ•˜์ง€ ์•Š์•„์š”. atom๊ธฐ๋ฐ˜์˜ ์—๋””ํ„ฐ์ธ๊ฒƒ ๊ฐ™์€๋ฐ, atom์ด ๋งฅ์—์„œ ๋„ˆ๋ฌด ๋А๋ ค์„œ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

julia tutorial

  • ์ด์ œ ์„ค์น˜๋„ ๋‹ค ํ–ˆ๊ณ , ๊ธฐ๋ณธ์ ์ธ julia syntax๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ญ ๋ฌผ๋ก  learn julia in y min์— ๋“ค์–ด๊ฐ€๋ฉด ๋‹ค ์žˆ๋Š” ๋‚ด์šฉ์ด๊ธฐ๋Š” ํ•ฉ๋‹ˆ๋‹ค.
  • ์ €๋Š” vscode๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋งˆํฌ๋‹ค์šด์—์„œ julia code block์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ด์„œ Markdown Julia๋ผ๋Š” ์ต์Šคํ…์…˜์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

julia basic

  • ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์ ์œผ๋กœ๋Š” ํŒŒ์ด์ฌ๊ณผ ๋น„์Šทํ•œ ๋ถ€๋ถ„์ด ์ƒ๋‹นํžˆ ๋งŽ๋„ค์š”.
### basic 
println(repeat("=", 20))
x = 10 
println("$x, $(2x), $(x^2+2x+1)")## 2*x๊ฐ€ ์•„๋‹ˆ๋ผ 2x๋กœ ํ•ด๋„ ์•Œ์•„์„œ ์ž˜ ์ธ์‹ํ•ด์คŒ 
let xx = 0;println(xx);end ## semicolon์œผ๋กœ oneliner ๊ฐ€๋Šฅ 
println("$(typeof('c')), $(typeof("C"))")## char์™€ string์ด ๋”ฐ์˜ดํ‘œ์™€ ํฐ ๋”ฐ์˜ดํ‘œ๋กœ ๊ตฌ๋ถ„๋จ 
println(repeat("=", 20))

## loop and iterator tools 
for x in enumerate(['a', 'b', 'c']);println(x);end ## loop๋Š” python๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•จ, enumerate๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ 
println(repeat("=", 20))
for x in zip([1,2,3], ['a', 'b', 'c']);println(x);end ## zip๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅ 
println(repeat("=", 20))

### container 
x_lst = append!([1,2,3], 1)## append๊ฐ€ ๊ฐ์ฒด์˜ method๊ฐ€ ์•„๋‹Œ function์œผ๋กœ ์กด์žฌํ•จ ๋˜ํ•œ ์•Œ์•„์„œ ๋ฆฌํ„ดํ•ด์คŒ 
println("$x_lst, length: $(length(x_lst))")
println(repeat("=", 20))
dict1 = Dict("one" => 1, "two" => 2, "three" => 3)
println(typeof(dict1))## dictionary์˜ key, value์— ๋Œ€ํ•ด์„œ ํƒ€์ž…์ด ์ •ํ•ด์ง
println("keys: $(keys(dict1))")## key, value๊ฐ€ function์œผ๋กœ ์‚ฌ์šฉ๋จ 
println("values: $(values(dict1))")
set1 = Set([1,1,1,1,1,2,2,2,2,3])
println("set1: $set1")

### exception handling
println(repeat("=", 20))
try
    println(x_lst[0])
catch e
    println(e)## indexing์ด 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ ๋ฐœ์ƒํ•จ 
end
println(repeat("=", 20))

### function
function func1(x, y)
    x+y ## return์ด ๋”ฐ๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„๋จ. ํ•ด๋„ ๋˜์ง€๋งŒ, ๋งˆ์ง€๋ง‰์— ์กด์žฌํ•˜๋Š” ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋ฆฌํ„ด๋จ 
end
anony_func1 = (x, y) -> x+y ## anonymous func
println(func1(2, 2))
println(anony_func1(2,2))
println(repeat("=", 20))

### list comprehension and dot function 
a = [i for i in range(0, 10)]
println(a)
println(a.^2)## dot function์„ ์“ฐ๋ ค๋ฉด . ๊ณผ ํ•จ๊ป˜ ์จ์ฃผ๋ฉด ๋จ 
println(repeat("=", 20))

### time checking 
@time begin
    [i for i in range(0, 10000)].*3
end
println(repeat("=", 20))

### type 
## type๊ฐ„์— inference tree๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ์ฒด์ฒ˜๋Ÿผ supertype์œผ๋กœ ์ ‘๊ทผ๊ฐ€๋Šฅ
## type inference์„ ์ด ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š”๋“ฏ 
for t in [Float16, Int16]
    print("$t")
    while true
        print(" ==> $(supertype(t))")
        t = supertype(t)
        if t == Any;break;end
    end
    print("\n");println(repeat("=", 60))
end
====================
10, 20, 121
0
Char, String
====================
(1, 'a')
(2, 'b')
(3, 'c')
====================
(1, 'a')
(2, 'b')
(3, 'c')
====================
[1, 2, 3, 1], length: 4
====================
Dict{String,Int64}
keys: String["two", "one", "three"]
values: [2, 1, 3]
set1: Set([2, 3, 1])
====================
BoundsError([1, 2, 3, 1], (0,))
====================
4
4
====================
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
====================
  0.056191 seconds (12.91 k allocations: 857.824 KiB)
====================
Float16 ==> AbstractFloat ==> Real ==> Number ==> Any
============================================================
Int16 ==> Signed ==> Integer ==> Real ==> Number ==> Any
============================================================

pipeline

  • ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์€ ํŠน์ • input์„ ๋ฐ›๊ณ  ํŠน์ • output์„ ๋‚ด๋ฑ‰๋Š” ํ˜•์‹์ด์ฃ . ๋งŒ์•ฝ ์–ด๋–ค ๊ฐ’, ํ˜น์€ ๋ฐ์ดํ„ฐ, ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ ๋“ฑ ๋‹ค์–‘ํ•œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์ ์šฉํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?
  • ๋ณดํ†ต ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ์š”.
    • ์šฐ์„  ๊ด„ํ˜ธ์™€ ํ•จ์ˆ˜๋ช…์ด ์—ฐ์†์œผ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ์–ด์„œ ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ง€๊ณ 
    • ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€๋ฅผ ์ฝ์œผ๋ ค๋ฉด ์ œ์ผ ์•ˆ์ชฝ๋ถ€ํ„ฐ ๋ฐ–์œผ๋กœ ์ฝ์–ด์•ผํ•˜์ฃ .
    • ์ด๊ฒŒ ๊ท€์ฐฎ์•„์„œ ํ•จ์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ํฐ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋Š” ์Šต๊ด€์ด ์ƒ๊ธฐ๊ธฐ ์‰ฝ๊ณ 
  • ๋ฌผ๋ก  map function์„ ์“ฐ๋ฉด ์ข€ ๋‚˜์•„์ง€๊ธฐ๋Š” ํ•ฉ๋‹ˆ๋‹ค๋งŒ, map function์œผ๋กœ๋Š” ํŒŒ์ด์ฌ์—์„œ ์ƒˆ๋กœ์šด ๋ณตํ•ฉํ•ฉ์ˆ˜๋ฅผ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ์–ด๋ ค์›Œ์š”. ๋ฌผ๋ก  reduce๋ฅผ ์“ฐ๋ฉด ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ๋Š” ํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์ œ๊ฐ€ ๋‹ค์Œ์— ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
a = 10
func1(func2(func3(func4(a))))
  • ์•„๋ฌดํŠผ ๊ฐ„์—, python์—์„œ๋Š” ๋ถ€์กฑํ•œ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์  ์ฝ”๋”ฉ์ด๋ผ๊ณ  ํ• ๊นŒ์š”, ์ด๋Ÿฐ ๋ถ€๋ถ„์ด R์—๋Š” pipeline(%>%)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  julia์—๋„ |>๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
a = 10 |> (x-> x+1) |> (x-> 2*x) |> (x->x^2) |> log
println(a) ## 6.182084906716632
  • ๋“ค์–ด๊ฐˆ ๊ฐ’์„ ๋„ฃ๊ณ , |>๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ํ•จ์ˆ˜์— ๋„˜๊ฒจ์ฃผ๊ณ , ๋‹ค์‹œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ , ์ด๋ ‡๊ฒŒ pipeline์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค๋ฉด(๋ฌผ๋ก  ์ง€๊ธˆ์€ ๊ทธ๋ƒฅ ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ), ๊ฐœ๋ณ„ํ•จ์ˆ˜๋Š” ๋ชจ๋“ˆ๋กœ์จ ๋งŒ๋“ค๊ณ  ์ด ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์šฉ์ดํ•˜์ฃ .
  • ๋‹ค์Œ์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋กœ ์ ์šฉํ•ด๋ณธ ๊ฒฐ๊ณผ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
    • ๊ทธ๋ƒฅ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋„ ํ•˜๊ณ ,
    • ์ •์˜๋œ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ๋ณตํ•ฉํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋„ ํ•˜๊ณ 
    • ๊ฐ™์€ ์ง“์„ map function์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜น์‹œ๋‚˜ ํ•ด์„œ ๋งํ•˜์ง€๋งŒ, julia์—์„œ anonymous function์€ x -> x+1๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
## R์—๋Š” pipeline(%>%)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒŒ ์•„์ฃผ ํŽธํ–ˆ๋Š”๋ฐ, julia์—๋„ ์žˆ๊ตฐ์š”. 
## pipeline์€ ํ•จ์ˆ˜๊ฐ€ ์—ฐ์†์œผ๋กœ ๋‚˜์—ด๋˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. python์—์„œ๋„ map์„ ์ด์šฉํ•˜๋ฉด ๊ตฌํ˜„์ด ๋˜๊ธฐ๋Š” ํ•˜๋Š”๋ฐ 
## ์ฉ ๋งˆ์Œ์— ๋“ค์ง€๋Š” ์•Š์•„์š”. 
k_lst = [1,2,3]
for (i, k) in enumerate(k_lst)
    ## ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์—ฐ์†์œผ๋กœ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. 
    new_x = k |> (x-> x+1) |> (x-> 2*x) |> (x->x^2) |> log
    println("$i: $new_x")
end

### ์‚ฌ์‹ค ์œ„์ฒ˜๋Ÿผ anonymous function์„ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค defined function์„ ์—ฌ๋Ÿฌ๊ฐœ ์“ธ ๋•Œ ๋” ํŽธํ•œ๋ฐ์š” 
## ํ•จ์ˆ˜๋ฅผ ์ž‘๊ฒŒ ์ชผ๊ฐœ๊ณ  ์ด๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ธก๋ฉด์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜์ฃ . 

println(repeat("==", 20))
pipe_comp1 = x -> x+1
pipe_comp2 = x -> 2*x
pipe_comp3 = x -> x^2
pipe_comp4 = x -> log(x)
func_pipe = x -> x |> pipe_comp1 |> pipe_comp2 |> pipe_comp3 |> pipe_comp4
for (i, x) in enumerate([1, 2, 3])
    println("$i ==> $(func_pipe(x))")
end

println(repeat("==", 20))
## ๋ฌผ๋ก  ์•„๋ž˜์ฒ˜๋Ÿผ map function์„ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค, ์ทจํ–ฅ์ด์ฃ . 
r = [1,2,3,4]; x = copy(r)
pipes = [pipe_comp1, pipe_comp2, pipe_comp3, pipe_comp4]
for p in pipes 
    x = map(p, x)
end
println(x)
1: 2.772588722239781
2: 3.58351893845611
3: 4.1588830833596715
========================================
1 ==> 2.772588722239781
2 ==> 3.58351893845611
3 ==> 4.1588830833596715
========================================
[2.77259, 3.58352, 4.15888, 4.60517]

package managing

  • python์—์„œ๋Š” pip๋กœ package๋ฅผ ์„ค์น˜ํ•˜๊ณ , import๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • julia์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”.
Pkg.available()## ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 
Pkg.add("Calculus") ## ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ 
Pkg.installed()## ์„ค์น˜๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฆฌ์ŠคํŠธ์—…
Pkg.add("Calculus")## install it with all dependent lib
using Calculus ## like from Calculus import * 
import Calculus ## like import pandas  

plotting

  • plottingํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Winston์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ด๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ์—๋Š” ์‹œ๊ฐ„์ด ์•„์ฃผ ๋งŽ์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ์˜ค๋ฒ„ํ•ด์„œ 1์‹œ๊ฐ„ ์ •๋„ ๊ฑธ๋ฆฐ ๊ฒƒ ๊ฐ™๋„ค์š”. ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ผ๋‹จ ์„ค์น˜๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ์•„์ฃผ ๋งŽ์€ ๋””ํŽœ๋˜ํŠธ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ์•ฝ ํ•œ์‹œ๊ฐ„ ์ •๋„ ๊ฑธ๋ฆฌ๊ณ ์š”.

Pkg.add("Winston")
INFO: Cloning cache of Cairo from https://github.com/JuliaGraphics/Cairo.jl.git
INFO: Cloning cache of IniFile from https://github.com/JuliaIO/IniFile.jl.git
INFO: Cloning cache of Tk from https://github.com/JuliaGraphics/Tk.jl.git
INFO: Cloning cache of Winston from https://github.com/JuliaGraphics/Winston.jl.git
INFO: Installing Cairo v0.5.2
INFO: Installing IniFile v0.4.0
INFO: Installing Tk v0.5.2
INFO: Installing Winston v0.13.2
INFO: Building Homebrew
...
  • ์ด์ œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ, ๋˜ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๊ฐ€ ๋œน๋‹ˆ๋‹ค. Cairo๋ฅผ ๋นŒ๋“œํ•ด์ฃผ๋ผ๊ณ  ํ•˜๋Š”๊ตฐ์š”..
using Winston
INFO: Precompiling module Cairo.
ERROR: LoadError: Cairo not properly installed. Please run
Pkg.build("Cairo")
  • ๋นŒ๋“œํ•ด์ฃผ๊ณ 
Pkg.build("Cairo")
  • ์ด์ œ ์จ๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ์ด์ œ๋Š” plot์ด๋ผ๋Š” ํ•จ์ˆ˜๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๊ณ  ํ•˜๋„ค์š”โ€ฆ.์–ด์ฉŒ๋ผ๋Š”๊ฑด์ง€โ€ฆ
# plot some data
using Winston 

pl = Winston.plot(cumsum(rand(500) .- 0.5), "r", cumsum(rand(500) .- 0.5), "b")
# display the plot (not done automatically!)
display(pl)

# save the current figure
savefig("winston.svg")
# .eps, .pdf, & .png are also supported
# we used svg here because it respects the width and height specified above
UndefVarError: plot not defined
  • ๊ทธ๋ž˜์„œ ์ข€ ๋” ์ฐพ์•„๋ณด๋‹ˆ, ์ด๋Ÿฐ ๊ฒฝ์šฐ๋“ค์ด ์ข…์ข… ์žˆ๋Š”๊ฒƒ ๊ฐ™์•„์š”. ์•„๋งˆ๋„ ์ œ๊ฐ€ ์„ค์น˜ํ•œ ๋ฒ„์ „๊ณผ ํ”Œ๋กœํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ(ํŠนํžˆ, jupyter notebok์ฒ˜๋Ÿผ ์›น์—์„œ ๋Œ์•„๊ฐ€๋Š” ์šฉ๋„๋กœ๋Š”)์—๋Š” ๋ฌธ์ œ๊ฐ€ ์ข€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ ์š”.

  • ๊ทธ๋ž˜์„œ PyPlot๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊น”์•„๋ด…๋‹ˆ๋‹ค. ์ด ์•„์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, python์—์„œ matplotlib๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š”๋ฐ, ๊ทธ๋Ÿด ๊ฑฐ๋ฉด, ์ œ๊ฐ€ ๊ทธ๋ƒฅ ํŒŒ์ด์ฌ์œผ๋กœ ํ•˜์ง€, ๋ญํ•˜๋Ÿฌ julia๋ฅผ ๊น”์•˜๋Š”๊ฐ€ ์‹ถ์ง€๋งŒ ๋ญ, ๊ทธ๋ƒฅ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๋Ÿฌ๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ž˜ ๋ฉ๋‹ˆ๋‹ค. ํ โ€ฆ

Pkg.add("PyPlot")
using PyPlot
x = -2pi:0.1:2pi;
plot(x, sin(x.^2)./x);

is it faster??

  • ๋๊ณ , ์ด์ œ ๋น ๋ฅธ์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

compute pi

  • pi๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. spigot algorithm ์„ ์ด์šฉํ•  ๊ฑฐ์—์š”.

  • ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋ฉด
%%timeit -n 10 -r 1
def compute_pi(n=10):
    r = 0
    for k in range(0, n):
        r+= 1/(16**k)*( 4/(8*k+1) - 2/(8*k+4) - 1/(8*k+5) - 1/(8*k+6))
    return r
compute_pi(20000)
  • julia ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋ฉด
@time begin
    function compute_pi(n=10)
        r = 0
        for k in 0:9
            r+= 1/(16^k)*( 4/(8k+1) - 2/(8k+4) - 1/(8k+5) - 1/(8k+6))
        end
        r
    end
    compute_pi(20000)
end 
  • python์˜ ๊ฒฝ์šฐ๋Š” 2.46์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ณ , julia์˜ ๊ฒฝ์šฐ๋Š” 0.02์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹คโ€ฆ.

  • ์ข€ ๋” ๋น„๊ต๋ฅผ ํ•ด๋ณด๊ธด ํ•ด์•ผ๊ฒ ์ง€๋งŒ, ๋น ๋ฅด๊ธด ์ง„์งœ ๊ฐœ๋น ๋ฅด๋„ค์š”โ€ฆ..

  • ๋ฌผ๋ก  numpy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋นจ๋ผ์ง€๊ธฐ๋Š” ํ•ด์š”. 470 microsecond, ์ฆ‰ 0.00047 ์ดˆ๋‹ˆ๊นŒ, ๋” ๋น ๋ฅด๊ตฐ์š”. ๋ฌผ๋ก  ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์จ์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ, pure julia์™€๋Š” ๋น„๊ต๋ฅผ ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ๋Š” ํ•˜์ฃ .

%%timeit -n 1 -r 1
def compute_pi(n=10):
    return np.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, 10)]).sum()
print(compute_pi(20000))

wrap-up

  • ์ €๋Š” ์ผ๋‹จ ์ด ํฌ์ŠคํŠธ๋ฅผ ๋‹ค ์“ฐ๊ณ  ๋‚œ ๋‹ค์Œ์—, juliaPro๋ฅผ ์ง€์šฐ๊ณ  julia1.0์„ ๋‹ค์‹œ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜์ง€ ์•Š์„๊นŒ? ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋””ํŽœ๋˜์‹œ๋ฅผ ์ž˜ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฌถ์—ฌ์žˆ๋Š” juliaPro๋ฅผ ์„ค์น˜ํ•œ ๊ฑด๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ์ž˜ ํ•ด์ฃผ์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.
  • ์†๋„ ์ธก๋ฉด์—์„œ๋Š” julia๋ฅผ python์ด ์ด๊ธธ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅด ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋‹ฌ๋ผ์ง€๊ธฐ๋Š” ํ•˜์ง€๋งŒ, pureํ•˜๊ฒŒ ์ €๋ ‡๊ฒŒ ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ํฐ ์žฅ์ ์ด์ฃ . ์‹ค์ œ๋กœ numpy์˜ ๊ฒฝ์šฐ๋Š” c๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฑด๋ฐ, ์ˆœ์ˆ˜ํ•˜๊ฒŒ julia๋งŒ์œผ๋กœ ์ € ์†๋„๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฑด ์ข€ ์••๋„์ ์ธ ๊ฒƒ ๊ฐ™์•„์š”.
  • ๋ฌผ๋ก  ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๋” ํ•ด๋ณด๊ณ ์‹ถ๊ธฐ๋Š” ํ•ฉ๋‹ˆ๋‹ค.

reference

๐Ÿ’กRELATED ARTICLES ยท ํ•จ๊ป˜ ์ฝ์œผ๋ฉด ์ข‹์€ ์—ฐ๊ด€ ํฌ์ŠคํŠธ

๊ธ€ ์ฃผ์†Œ๊ฐ€ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.