CoCalc Shared Files07. Jupyter-ostalo / Julia.ipynb
Author: Ivica Nakić

# Julia

Julia je novi jezik, nastao 2012. godine. Julia je dinamički jezik koji se može kompajlirati te dobiti vrlo dobre performanse (često u rangu C-a). Ima sličnosti s Pythonom, ali i s Lispom. Prvenstvena namjena mu je znanstveno računanje, ali dizajniran je tako da i u domeni nespecijaliziranih programskih jezika može naći svoje mjesto.

In [1]:
VERSION

v"0.5.0"
In [2]:
f(x, y) = 1 + 2x*y^2

f (generic function with 1 method)
In [3]:
f(1,4)

33
In [4]:
α=3

3
In [5]:
println("α=", α)

α=3
In [6]:
μ=3
println("Sinus od $μ je$(sin(μ))")

Sinus od 3 je 0.1411200080598672
In [7]:
10^19

-8446744073709551616
In [8]:
BigInt(10)^19

10000000000000000000
In [9]:
a = Int8(1)
b = Int8(2)
a + b

3
In [10]:
typeof(ans)

Int8
In [11]:
typemax(Int64)

9223372036854775807
In [12]:
c = 1+3.5im

1.0 + 3.5im
In [13]:
c^2

-11.25 + 7.0im
In [14]:
c.re, c.im

(1.0,3.5)
In [15]:
3//4

3//4
In [16]:
typeof(ans)

Rational{Int64}
In [17]:
//(3, 4)

3//4
In [18]:
//

// (generic function with 7 methods)
In [19]:
methods(//)

7 methods for generic function //:
In [20]:
l = [3, 4, 5]

3-element Array{Int64,1}: 3 4 5
In [21]:
l[1]

3
In [22]:
l[1:2]

2-element Array{Int64,1}: 3 4
In [23]:
l[2:end]

2-element Array{Int64,1}: 4 5
In [24]:
l[1:end-1]

2-element Array{Int64,1}: 3 4
In [25]:
a = [1.1, 2.2, 3.3]
b = [4.4, 5.5, 6.6]

3-element Array{Float64,1}: 4.4 5.5 6.6
In [26]:
dot(a,b)

38.72
In [27]:
⋅(a,b)

38.72
In [28]:
a.*b

3-element Array{Float64,1}: 4.84 12.1 21.78
In [29]:
norm(a)

4.115823125451335
In [30]:
a⋅b

38.72
In [31]:
a×b

3-element Array{Float64,1}: -3.63 7.26 -3.63
In [32]:
Ψ = norm

norm (generic function with 9 methods)
In [33]:
Ψ(a)

4.115823125451335
In [34]:
?norm

search: norm normpath normalize normalize! normalize_string vecnorm issubnormal
norm(A, [p])


Compute the p-norm of a vector or the operator norm of a matrix A, defaulting to the p=2-norm.

For vectors, p can assume any numeric value (even though not all values produce a mathematically valid vector norm). In particular, norm(A, Inf) returns the largest value in abs(A), whereas norm(A, -Inf) returns the smallest.

For matrices, the matrix norm induced by the vector p-norm is used, where valid values of p are 1, 2, or Inf. (Note that for sparse matrices, p=2 is currently not implemented.) Use vecnorm to compute the Frobenius norm.

In [35]:
suma = 0
for i = 1:10
suma += i
end
println("Suma je $suma")  Suma je 55 In [36]: kvadrati = [i^2 for i in [1:2:10; 7]]  6-element Array{Int64,1}: 1 9 25 49 81 49 In [37]: M = [2 1; 1 1]  2×2 Array{Int64,2}: 2 1 1 1 In [38]: M[:,1]  2-element Array{Int64,1}: 2 1 In [39]: rand()  0.194052272230967 In [40]: v = [1, 2]  2-element Array{Int64,1}: 1 2 In [41]: M*v  2-element Array{Int64,1}: 4 3 In [42]: dot(v,v)  5 In [43]: M = rand(100, 100)  100×100 Array{Float64,2}: 0.823685 0.959533 0.914166 … 0.634468 0.55875 0.959321 0.888054 0.517168 0.98111 0.767699 0.0826222 0.313916 0.526687 0.452331 0.0186533 0.0750501 0.950221 0.484281 0.905193 0.477754 0.666308 0.119242 0.748496 0.510197 0.552254 0.845979 0.0635522 0.206468 0.405423 0.0730754 0.705777 0.759756 0.78426 … 0.64529 0.586206 0.902311 0.418558 0.349762 0.314765 0.442339 0.635466 0.157412 0.284421 0.396884 0.878606 0.218935 0.503469 0.309289 0.985913 0.545452 0.405668 0.494811 0.297475 0.961027 0.852446 0.388494 0.671127 0.275561 0.526394 0.730511 0.109036 0.497742 0.316859 … 0.847041 0.435709 0.434643 0.14566 0.0323608 0.874718 0.686789 0.065643 0.880529 0.439728 0.192207 0.0268152 0.473984 0.741708 0.937173 ⋮ ⋱ 0.994145 0.799665 0.13128 0.946506 0.79288 0.639039 0.752141 0.707233 0.288864 0.691256 0.343201 0.0835424 0.788981 0.0655596 0.262611 … 0.163575 0.36919 0.369076 0.203687 0.804314 0.487234 0.342588 0.184886 0.262782 0.449541 0.652579 0.0511055 0.165664 0.889631 0.408358 0.8354 0.584587 0.249332 0.380268 0.346006 0.719066 0.863734 0.436482 0.242159 0.979589 0.22725 0.840324 0.720361 0.284384 0.511806 … 0.761623 0.771165 0.849925 0.592886 0.905295 0.412045 0.360163 0.890909 0.644862 0.133634 0.384939 0.083474 0.528835 0.0508042 0.145624 0.97755 0.418905 0.169726 0.101553 0.657945 0.5839 0.381275 0.711899 0.174598 0.927804 0.690078 0.249492 In [44]: @time lamb, vv = eig(M)  0.660276 seconds (405.51 k allocations: 17.288 MB, 1.26% gc time) (Complex{Float64}[49.7051+0.0im,2.80627+0.901813im,2.80627-0.901813im,1.32752+2.54612im,1.32752-2.54612im,2.90142+0.0im,-2.91262+0.0524949im,-2.91262-0.0524949im,1.9868+1.79619im,1.9868-1.79619im … -0.794771-0.174447im,0.644836+0.419374im,0.644836-0.419374im,0.214759+0.0im,-0.577777+0.495315im,-0.577777-0.495315im,0.282011+0.582889im,0.282011-0.582889im,0.194124+0.168054im,0.194124-0.168054im], Complex{Float64}[-0.0986176+0.0im 0.055689-0.0109681im … -0.00190763+0.0860034im -0.00190763-0.0860034im; -0.097162+0.0im 0.00428767+0.00225751im … 0.017157-0.00893366im 0.017157+0.00893366im; … ; -0.0991484+0.0im -0.038184+0.0420319im … -0.0170382+0.0517033im -0.0170382-0.0517033im; -0.110852+0.0im 0.0604364+0.101726im … -0.00615236-0.136541im -0.00615236+0.136541im]) In [45]: lu(M)  ( [1.0 0.0 … 0.0 0.0; 0.205062 1.0 … 0.0 0.0; … ; 0.15923 -0.00455682 … 1.0 0.0; 0.996428 -0.45928 … 0.0728867 1.0], [0.994155 0.743064 … 0.196954 0.523056; 0.0 0.826546 … 0.361956 0.753536; … ; 0.0 0.0 … -5.56871 -1.357; 0.0 0.0 … 0.0 -0.714286], Int32[21,64,81,17,79,58,30,16,41,19 … 32,82,51,80,36,2,100,22,73,50]) In [46]: norm(M)  49.90371178351387 In [47]: function normakvadrata(M) norm(M^2) end  normakvadrata (generic function with 1 method) In [48]: normakvadrata(M)  2480.458037303798 In [49]: Base.:+(s1::AbstractString, s2::AbstractString) = string(s1, s2)  In [50]: "Prvi" + " drugi"  "Prvi drugi" In [51]: "Vrijednost od x je " + 3  MethodError: no method matching +(::String, ::Int64) Closest candidates are: +(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:138 +(!Matched::Complex{Bool}, ::Real) at complex.jl:151 +(!Matched::Char, ::Integer) at char.jl:40 ...   In [52]: Base.:+(s::AbstractString, x::Number) = s + "$(2x)"

In [53]:
"Vrijednost od x je " + 3

"Vrijednost od x je 6"
In [54]:
immutable Vector2D
x::Float64
y::Float64
end

In [55]:
v = Vector2D(3, 4);
w = Vector2D(5, 6);

In [56]:
v + w

MethodError: no method matching +(::Vector2D, ::Vector2D) Closest candidates are: +(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:138  
In [57]:
Base.:+(v::Vector2D, w::Vector2D) = Vector2D(v.x+w.x, v.y+w.y)

In [58]:
v+w

Vector2D(8.0,10.0)
In [59]:
Base.:*(v::Vector2D, α::Number) = Vector2D(v.x*α, v.y*α)
Base.:*(α::Number, v::Vector2D) = Vector2D(v.x*α, v.y*α)

In [60]:
v * 3.5

Vector2D(10.5,14.0)
In [61]:
3.5 * v

Vector2D(10.5,14.0)
In [62]:
methods(+)

166 methods for generic function +:
In [63]:
function sum1(N::Int)
total = 0

for i in 1:N
total += i/2
end

total
end

function sum2(N::Int)
total = 0.0

for i in 1:N
total += i/2
end

total
end

sum2 (generic function with 1 method)
In [64]:
sum1(10), sum2(10)

(27.5,27.5)
In [65]:
N = 10000000

@time sum1(N)
@time sum2(N)

0.267848 seconds (30.00 M allocations: 457.764 MB, 15.53% gc time) 0.010801 seconds (5 allocations: 176 bytes)
2.50000025e13
In [66]:
code_typed(sum2, (Int,))

1-element Array{Any,1}: LambdaInfo for sum2(::Int64)
In [67]:
code_llvm(sum2, (Int, ))

define double @julia_sum2_72290(i64) #0 { top: %1 = icmp slt i64 %0, 1 br i1 %1, label %L2, label %if.preheader if.preheader: ; preds = %top br label %if L2.loopexit: ; preds = %if br label %L2 L2: ; preds = %L2.loopexit, %top %total.0.lcssa = phi double [ 0.000000e+00, %top ], [ %5, %L2.loopexit ] ret double %total.0.lcssa if: ; preds = %if.preheader, %if %total.04 = phi double [ %5, %if ], [ 0.000000e+00, %if.preheader ] %"#temp#.03" = phi i64 [ %2, %if ], [ 1, %if.preheader ] %2 = add i64 %"#temp#.03", 1 %3 = sitofp i64 %"#temp#.03" to double %4 = fmul double %3, 5.000000e-01 %5 = fadd double %total.04, %4 %6 = icmp eq i64 %"#temp#.03", %0 br i1 %6, label %L2.loopexit, label %if }
In [68]:
code_native(sum2, (Int,))

.text Filename: In[63] pushq %rbp movq %rsp, %rbp xorpd %xmm0, %xmm0 xorl %eax, %eax Source line: 14 testq %rdi, %rdi jle L56 movabsq \$140600821612904, %rcx # imm = 0x7FE02E070168 movsd (%rcx), %xmm1 # xmm1 = mem[0],zero nopl (%rax) Source line: 15 L32: incq %rax xorps %xmm2, %xmm2 cvtsi2sdq %rax, %xmm2 mulsd %xmm1, %xmm2 addsd %xmm2, %xmm0 Source line: 14 cmpq %rax, %rdi jne L32 Source line: 18 L56: popq %rbp retq nopw (%rax,%rax)
In [69]:
using PyCall
@pyimport numpy.random as nprandom
nprandom.rand(3,4)

3×4 Array{Float64,2}: 0.641178 0.344351 0.386636 0.794118 0.0545324 0.969383 0.110949 0.453816 0.734294 0.963323 0.603344 0.0206484
In [70]:
objective = x -> cos(x) - x #ekvivalent lambda funkcijama u Pythonu

(::#3) (generic function with 1 method)
In [71]:
objective(1)

-0.45969769413186023
In [72]:
t = ccall( (:clock, "libc"), Int32, ())

19913557
In [73]:
function es(n::Int64)
l = ones(Bool, n)
l[1] = false
for i in 2:int64(sqrt(n))
if l[i]
for j in (i*i):i:n
l[j] = false
end
end
end
return filter(x -> l[x],1:n)
end

es (generic function with 1 method)