Numba를 사용하여 간편한 가속 승리

6398 단어 python
만약 함수에 수학 연산을 많이 하고, NumPy를 사용하거나, 순환에 심각하게 의존한다면, 한 줄의 코드로 그것들의 속도를 현저하게 높일 수 있는 방법이 있다.네, 수입까지 포함하면 두 줄입니다.

Numba 및 @jit 데코레이터
Numba@jit 장식사와 만나다.그것은 코드의 컴파일 방식을 바꾸어 통상적으로 성능을 향상시킬 것이다.특별한 도구 numba 를 설치할 필요도 없고, 매개 변수를 조정할 필요도 없습니다.네가 해야 할 일은:
  • 함수에 @jit 장식기 추가
  • 더 빠른지 확인
  • 응용Numba의 최적화 전후 코드 예시를 살펴봅시다.
    # numba_testing.py
    
    import math
    
    def compute():
        # Bunch of dummy math operations
        result = 0
        for number in range(1_000_000):
            double = number * 2
            result += math.sqrt(double) + double
        return result
    
    이 코드의 유일한 목적은 계산을 하고 속도를 늦추는 것이다속도가 얼마나 느린지 봅시다. (Python3.8에서 기준 테스트를 완성했습니다. Introduction article on my blog 에서 전체 설정을 설명했습니다.)
    $ python -m timeit -s "from numba_testing import compute" "compute()"
    1 loop, best of 5: 217 msec per loop
    
    현재 코드에 @jit를 추가합니다.함수의 주체는 변하지 않으며 유일한 차이점은 decorator이다.pip(pip install numba로 Numba 패키지를 설치하는 것을 잊지 마세요.
    # numba_testing.py
    
    import math
    
    from numba import jit
    
    @jit
    def compute_jit():
        # Bunch of dummy math operations
        result = 0
        for number in range(1_000_000):
            double = number * 2
            result += math.sqrt(double) + double
        return result
    
    실행 시간을 다시 측정해 보겠습니다.
    $ python -m timeit -s "from numba_testing import compute_jit" "compute_jit()"
    200 loops, best of 5: 1.76 msec per loop
    
    @jit decorator를 사용하면 우리의 속도가 120배 높아졌다(217/1.76=123.295)!이런 간단한 변화에 대해 말하자면, 이것은 거대한 진보이다!

    Numba의 추가 피쳐
    @jit는 Numba 라이브러리에서 가장 일반적인 인테리어이지만 다른 인테리어를 사용할 수도 있습니다.
  • @njit-jit의 별명(nopython=True).nopython 모드에서 Numba는 파이톤 해석기를 전혀 사용하지 않은 상태에서 코드를 실행하려고 시도합니다.그것은 더 큰 속도 향상을 가져올 수도 있지만, 이런 모드에서 컴파일링에 실패할 수도 있다.
  • @vectorize와 @guvectorize - NumPy에서 사용하는 제품sufunc와generalizedufunc.
  • @jitclass-반 전체를 장식할 수 있습니다.
  • @cfunc-이 컴퓨터의 리셋에 사용할 함수 (C 또는 C++ 코드에서 온 것) 를 설명합니다.
  • 예를 들어 @cuda가 있는 GPU에서 코드를 실행할 수 있는 고급 기능도 있습니다.정시제.이것은 상자를 열어 바로 사용할 수 있는 것이 아니지만, 몇몇 계산량이 매우 많은 조작에 있어서, 이것은 아마도 가치가 있을 것이다.
    Numba에는 다양한 구성 옵션이 있으며, 자신이 무엇을 하는지 알고 있으면 코드의 실행 시간을 더욱 높일 수 있습니다.다음을 수행할 수 있습니다.
  • 사용nogil GIL 비활성화Global Interpreter Lock
  • 사용cache 캐시 결과
  • 는 자동으로 함수와 parallel를 병행한다.
  • 네가 무엇을 할 수 있는지 살펴보아라.더 많은 실제 예(예를 들어 블레이크 스콜스 모형이나 론나드 존스세 계산)를 보려면 documentation 페이지를 방문하십시오.
    Numba Examples
    결론Numba는 아주 좋은 라이브러리로 최소한의 노력으로 프로그램의 속도를 현저하게 가속화할 수 있다.느린 기능을 설치하고 수식하는 데 1분도 걸리지 않는다는 것을 감안하여 코드를 빨리 개선하려면 (코드를 다시 쓸 필요가 없음), 이것은 당신이 검사할 수 있는 첫 번째 해결 방안 중의 하나입니다.
    코드:
  • NumPy 대량 사용
  • 대량 수학 연산 집행
  • 루프 실행

  • 누바를 어떻게 찾았지?
    몇 년 전, 나는 에서 코드 도전을 할 때 처음으로 Numba를 알게 되었다.나는 그것을 계속 운행하게 하고 점심을 먹으러 가는 아주 나쁜 알고리즘을 썼다.내가 한 시간 후에 돌아왔을 때, 나의 프로그램은 아직 10퍼센트를 완성하지 못했다.나는 그것을 멈추고 @jit 장식기를 주 함수에 추가한 후에 그것을 다시 실행했다. 1분도 안 되어 결과를 얻었다.거의 아무 일도 하지 않고 놀라운 발전을 이루었다!
    이 이야기는 결코 경솔한 코드를 작성한 후에 해커를 사용하여 속도를 높일 수 있다는 것을 의미하지 않는다😉. 하지만 때로는 일회성 계산만 하면 된다.너는 완벽한 알고리즘을 작성하는 데 너무 많은 시간을 들이고 싶지 않다.아니면 더 좋은 알고리즘을 생각해 내지 못할 수도 있고, 알고리즘이 너무 느리다.Numba와 같은 도구를 사용하는 것은 응용 개선이 가장 빠르고 가장 간단한 방법 중의 하나일 수 있습니다!

    좋은 웹페이지 즐겨찾기