파이톤과 Numba 가속 수치로 계산할 때의 지식

파이썬 프로그램의 고속화를 연구하기 위해 누바를 사용했다.
실장 과정에서 각종 오류가 발생하여 걸려 넘어졌기 때문에 우리는 이 지식들을 샘플로 공유할 것이다.
나의 경우 루건 쿠타법의 입자군 최적화법을 사용하여 계산하면 속도가 약 2000초→60초와 33배이다.
※ 주의 ※
  • Numba의 기본적인 사용 방법은 문헌을 참고하십시오.
  • 모든 사용 예시에서 noptython 모드를 사용했다njit
  • Numba는 매개 변수나 반환 값의 유형을 지정하지 않는 경우에도 동작하지만 이 전제 조건은 모두 지정됩니다.
  • 1. 환경


    $ sw_vers
    ProductName:	Mac OS X
    ProductVersion:	10.15.2
    BuildVersion:	19C57
    
    $ python -V
    Python 3.8.5
    
    $ pip freeze
    numba==0.51.0
    numpy==1.19.1
    
    다음 명령을 사용하여 Numba를 설치할 수 있습니다.
    $ pip install numba
    

    2. 사용 예


    2-1. 함수 내의np.empty 사용


    numba를 사용할 때 함수 np.empty 에서 사용하면 오류가 발생할 수 있습니다.
    이런 상황에서 다음과 같이 유형을 지정하면 일을 잘 할 수 있다.
    main.py
    import numpy as np
    from numba import njit
    
    @njit("f8[:,:]()")
    def func():
        x = np.empty((1, 2), dtype=np.float64)
        return x
    
    print(func())
    

    2-2. 여러 반환 값 반환


    여러 개의 반환 값을 되돌릴 때 Tuple((i8, i8)) 와 같다.
    괄호는 이중으로 되어 있으니 주의해야 한다.
    main.py
    import numpy as np
    from numba import njit
    
    @njit("Tuple((i8, i8))(i8, i8)")
    def func(x, y):
        return x, y
    
    print(func(1, 2))
    
    

    2-3. 다차원 목록 처리


    Numba가 다중 레벨 목록을 처리하는 경우 f8[:,:]처럼 씁니다.
    2차원이기 때문에 콜럼버스가 두 개만 있는 것은 아니다. 몇 차원이든 두 개든 다 된다.
    main.py
    import numpy as np
    from numba import njit
    
    @njit("f8[:,:](f8[:,:])")
    def func(x):
        return x ** 2
    
    x = np.random.rand(5, 5)
    print(func(x))
    

    3. 끝


    파이톤의 고속화에는 씨톤과 주리아 등 다양한 방법이 있지만, 장식물만 쓰는 누바의 방법이 가장 간단하다고 생각한다.
    학급과 발전기 사용 불가 등 제한이 있지만 국부적으로 병목을 가속하는 방법이라면 쉽게 실현될 수 있을 것 같다.

    4. 참고 문헌

  • numba의 for문 고속화와 jit 매개 변수 때문에
  • 고속 Numba 도입 2
  • How to use np.empty inside numba compiled function; Error message “All templates rejected”
  • 좋은 웹페이지 즐겨찾기