일반적으로 특정 시간 동안 얼마나 많은 반복 작업을 수행 할 수 있는지를 보는 것이 아니라 물질의 무언가를 계산하는 데 걸리는 시간을 측정하기 때문에 이것은 일종의 이상한 성능 비교입니다. Python 및 Julia 코드를 작동시키는 데 문제가 있었으므로 Julia 코드를 수정하여 작동하고 Python 코드를 실행하지 않았습니다. 의견에서 @chepner가 언급했듯이 객체를 사용 now()
하고 시간을 비교하는 DateTime
것은 상당히 비쌉니다. Python time.time()
함수는 부동 소수점 값만 반환합니다. 결과적으로 time()
똑같은 일을 하는 Julia 함수 가 있습니다.
julia> time()
1.587648091474481e9
f()
내 시스템에서 원래 기능 (작동하도록 수정) 의 타이밍은 다음과 같습니다 .
julia> using Dates
julia> function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Millisecond(1000)
break
end
end
return i
end
f (generic function with 1 method)
julia> f()
4943739
시간이 다하기 전에 거의 500 만 회를 반복했습니다. 내가 말했듯이, 나는 상당한 방해없이 내 시스템에서 파이썬 코드를 실행할 수 없었습니다 (귀찮게하지 않았습니다). 그러나 여기에 대신 f()
사용 하는 버전이 있습니다 .time()
g()
julia> function g()
i = 0
t1 = time()
while true
i += 1
if time() - t1 >= 1
break
end
end
return i
end
g (generic function with 1 method)
julia> g()
36087637
이 버전은 3 천 6 백만 번 반복되었습니다. 줄리아가 루핑 속도가 더 빠를 것 같아요? 예이! 글쎄, 실제로이 루프의 주요 작업은 호출입니다 time()
. Julia는 많은 time()
호출 을 생성하는 데 더 빠릅니다 !
왜 시간이 이상한가요? 내가 말했듯이, 실제 작업의 대부분은 전화 time()
입니다. 루프의 나머지 부분은 실제로 아무것도하지 않습니다. 최적화 된 컴파일 언어에서 컴파일러가 아무것도하지 않는 루프를 발견하면 완전히 제거합니다. 예를 들면 다음과 같습니다.
julia> function h()
t = 0
for i = 1:100_000_000
t += i
end
return t
end
h (generic function with 1 method)
julia> h()
5000000050000000
julia> @time h()
0.000000 seconds
5000000050000000
우와, 0 초! 어떻게 가능합니까? 자, LLVM 코드 (머신 코드와 비슷하지만 중간 표현으로 사용되는 가상 머신)를 살펴 보자 .
julia> @code_llvm h()
; @ REPL[16]:1 within `h'
define i64 @julia_h_293() {
top:
; @ REPL[16]:6 within `h'
ret i64 5000000050000000
}
컴파일러는 루프를보고 결과가 매번 동일하다는 것을 알아 내고 실제로 루프를 실행하는 대신 상수 값을 반환합니다. 물론 시간이 전혀 걸리지 않습니다.