파이썬 대 줄리아 속도 비교


9

이 두 스 니펫을 비교하고 1 초에 얼마나 많은 반복을 수행 할 수 있는지 확인하려고했습니다. Julia는 250 만 회 반복하는 반면 Python은 4 백만 회 달성합니다. 줄리아가 더 빨라야하지 않나요? 아니면이 두 발췌 문장은 동일하지 않습니까?

파이썬 :

t1 = time.time()
i = 0
while True:
    i += 1
    if time.time() - t1 >= 1:
        break

줄리아 :

function f()
    i = 0
    t1 = now()
    while true
        i += 1
        if now() - t1 >= Base.Dates.Millisecond(1000)
            break
        end
    end
    return i
end

4
Julia가 어떻게 작동하는지 잘 모르겠지만 Python은 간단한 정수 비교를 수행하는 동안 모든 비교에 대해 새 객체를 생성해야합니다.
chepner

1
또한 이것은 일종의 가난한 사람의 속도 비교입니다. 요즘에는 파이썬과 줄리아가 적절한 양의 동기 부여 (양쪽에)와 거의 같은 속도로 실행되도록 할 수 있습니다. 이 작업을 수행하여 언어 중 하나를 선택하는 경우 생각하기 쉬운 언어를 찾으십시오. 실제로 필요할 때 나중에 최적화 할 수 있습니다.
norok2

@ norok2 일부 코드에는 해당되지만 다른 코드에는 해당되지 않습니다. 파이썬 코드를 빠른 언어로 작성된 라이브러리 함수에 대한 호출로 변환 할 수 있거나 numba 또는 이와 유사한 기능을 지원하는 경우 파이썬이 상당히 느립니다.
DNF

@DNF Python이 더 빠른 곳과 Julia가 더 빠른 곳이 있습니다. 두 가지 예를 모두 찾을 수 있다고 확신합니다. 파이썬이 상대적으로 비싼 명시 적 루핑 및 함수 호출 때문에 "중요하게"(어떤 의미가 있든) 느리다고 말하는 완전한 그림을 지나치게 무시하고 있습니다. 물론, 그것이 당신의 일꾼이라면 줄리아와 더 낫습니다. 그러나 올바른 도구를 사용하면 Python에서도 똑같이 빨라질 수 있습니다. 이러한 도구를 배우는 것이 가치가 있거나 다른 언어를 배우는 것이 좋습니다. 말하기 어렵다.
norok2

1
나는 두 가지 언어를 모두 사용하며 두 가지 모두 더 빠른 '일부'예가 있지만 균형은 한쪽에 있습니다. 이는 단순히 파이썬이 해석되어 성능에 거의 초점을 맞추지 않은 결과 일 뿐이며 Julia는 성능에 중점을 둡니다. 실제로 파이썬이 C만큼 빠르다고 말하는 것과 비슷 합니다. 큰 차이 없다면 매우 이상 할 것이며 Julia의 많은 목적을 손상시킬 것입니다.
DNF

답변:


9

일반적으로 특정 시간 동안 얼마나 많은 반복 작업을 수행 할 수 있는지를 보는 것이 아니라 물질의 무언가를 계산하는 데 걸리는 시간을 측정하기 때문에 이것은 일종의 이상한 성능 비교입니다. 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
}

컴파일러는 루프를보고 결과가 매번 동일하다는 것을 알아 내고 실제로 루프를 실행하는 대신 상수 값을 반환합니다. 물론 시간이 전혀 걸리지 않습니다.


프로그래밍 언어 의 BogoMips
norok2

1
bogomips는 프로그래밍 언어가 아닌 CPU를 측정하는 데 사용됩니다. 그러나 확실히 측정 할 수있는 것입니다.
StefanKarpinski

4

time_nsJulia에서 함수 를 사용하고 싶을 것입니다 .

function f()
    i = 0
    t1 = time_ns()
    while true
        i += 1
        if time_ns() - t1 >= 10^9
            break
        end
    end
    return i
end

내 컴퓨터에서는 Python보다 10 배 빠르게 실행됩니다.


4

글쎄, 그건 내 시스템에서 관찰 한 것이 아닙니다.

파이썬 3.7.7

Python 3.7.7 (default, Mar 26 2020, 15:48:22) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import time                                                                                                                                                       

In [2]: def f(): 
   ...:     t1 = time.time() 
   ...:     i = 0 
   ...:     while True: 
   ...:         i += 1 
   ...:         if time.time() - t1 >= 1: 
   ...:             return i 
   ...:                                                                                                                                                                   

In [3]: f()                                                                                                                                                               
Out[3]: 4676268


줄리아 1.4.0 :

julia> using Dates

julia> function f()
           i = 0
           t1 = now()
           while true
               i += 1
               if now() - t1 >= Dates.Millisecond(1000)
                   break
               end
           end
           return i
       end
f (generic function with 1 method)

julia> f()
6339528

그러나 단순히 사용하는 것 time(즉, 일반 숫자를 비교하는 것)이 여전히 빠릅니다.

julia> function f()
           i = 0
           t1 = time()
           while true
               i += 1
               if time() - t1 >= 1
                   break
               end
           end
           return i
       end
f (generic function with 1 method)

julia> f()
24742703

time.perf_counter_ns()파이썬에서 사용해서는 안 됩니까?
norok2

time.perf_counter_ns를 사용해도이 벤치 마크에 대해 (적어도 내 시스템에서는) 아무것도 변경되지 않습니다. 1 초 단위로 시간 차이를 측정 할 때 시간 측정의 정확도는별로 중요하지 않습니다. 측정을 수행하고 결과 객체를 비교하는 데 걸리는 시간 (루프 자체의 효율성)도 중요합니다.
François Févotte

Julia 측정 시간이 중요합니다. 그래서 내 코드 에서는 ~ 30 % 빠르지 time_ns않기 time때문에 사용 했습니다.
Bogumił Kamiński
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.