developer tip

NumPy의 수학 함수가 Python보다 빠릅니까?

optionbox 2020. 12. 24. 23:37
반응형

NumPy의 수학 함수가 Python보다 빠릅니까?


기본 수학 함수 (abs, cosh, sinh, exp, ...)의 조합으로 정의 된 함수가 있습니다.

그것은 예를 들어, 사용 (속도) 차이가 있는지 나는 궁금 numpy.abs()대신 abs()?


타이밍 결과는 다음과 같습니다.

lebigot@weinberg ~ % python -m timeit 'abs(3.15)' 
10000000 loops, best of 3: 0.146 usec per loop

lebigot@weinberg ~ % python -m timeit -s 'from numpy import abs as nabs' 'nabs(3.15)'
100000 loops, best of 3: 3.92 usec per loop

numpy.abs()abs()Numpy 배열도 처리하기 때문에 속도가 느립니다 . 이러한 유연성을 제공하는 추가 코드가 포함되어 있습니다.

그러나 Numpy 배열에서 빠릅니다.

lebigot@weinberg ~ % python -m timeit -s 'a = [3.15]*1000' '[abs(x) for x in a]'
10000 loops, best of 3: 186 usec per loop

lebigot@weinberg ~ % python -m timeit -s 'import numpy; a = numpy.empty(1000); a.fill(3.15)' 'numpy.abs(a)'
100000 loops, best of 3: 6.47 usec per loop

(추신 : '[abs(x) for x in a]'Python 2.7에서 더 map(abs, a)느린 것보다 더 느립니다. 약 30 % 더 빠릅니다. 여전히 NumPy보다 훨씬 느립니다.)

따라서 numpy.abs()1 개의 단일 플로트보다 1000 개의 요소에 더 많은 시간이 걸리지 않습니다!


numpy의 유형을 처리하려면 numpy 함수를 사용하고 일반 Python 유형을 처리하려면 일반 Python 함수를 사용해야합니다.

최악의 성능은 일반적으로 유형 변환으로 인해 Python 내장 기능을 numpy와 혼합 할 때 발생합니다. 이러한 유형 변환은 최근에 최적화되었지만 여전히 사용하지 않는 것이 좋습니다. 물론 마일리지는 다를 수 있으므로 프로파일 링 도구를 사용하여 알아 내십시오.

또한 프로그램을 더욱 최적화하려면 cython과 같은 프로그램을 사용하거나 C 모듈을 만드는 것을 고려하십시오. 또는 공연이 중요 할 때 파이썬을 사용하지 않는 것을 고려하십시오.

그러나 데이터가 numpy 배열에 들어가면 numpy가 데이터 묶음을 계산하는 데 정말 빠를 수 있습니다.


사실, numpy 배열에서

를 통한 내장 abs호출 numpy의 구현 __abs__왜 abs와 같은 내장 함수가 numpy 배열에서 작동합니까?를 참조하십시오 .

따라서 이론적으로 성능 차이가별로 없어야합니다.

import timeit

x = np.random.standard_normal(10000)

def pure_abs():
    return abs(x)

def numpy_abs():
    return np.absolute(x)

n = 10000

t1 = timeit.timeit(pure_abs, number = n)
print 'Pure Python abs:', t1
t2 = timeit.timeit(numpy_abs, number = n)
print 'Numpy abs:', t2
Pure Python abs: 0.435754060745
Numpy abs: 0.426516056061

참조 URL : https://stackoverflow.com/questions/3650194/are-numpys-math-functions-faster-than-pythons

반응형