Numba를 사용한 더 빠른 Python 시뮬레이션

시뮬레이션 모델링의 필수 부분은 시뮬레이션 런타임입니다. 대규모 이산 이벤트 시뮬레이션 모델 과 중간 규모의 에이전트 기반 시뮬레이션 모델은 계산 리소스를 소비하고 런타임이 매우 길 수 있습니다. 소스 코드가 완전히 Python으로 작성된 경우 특히 그렇습니다. 따라서 Python에서 Numba로 몇 가지 테스트를 수행했습니다. 내 결과를 여기에 공유합니다. 먼저 Python의 테스트 함수에 대한 간단한 테스트를 실행합니다. 그런 다음 Python의 에이전트 기반 모델링 프레임워크에 Numba를 적용하여 런타임 성능 향상을 요약했습니다.

파이썬에 Numba 설치하기

Numba는 pip install 명령을 사용하여 설치할 수 있습니다. 터미널에 다음을 입력하기만 하면 됩니다.

pip install numba

목록의 경우 기본 Python 목록 을 피할 수 있으므로 numpy (즉 , numpy 배열) 를 사용하는 것이 좋습니다 . 아직 설치하지 않은 경우 같은 방식으로 numy를 설치할 수 있습니다.

pip install numpy

이제 numpy 및numa를 가져오고 numbera를 사용하여 코드를 더 빠르게 실행할 수 있습니다. 이를 위해 @njit 데코레이터 를 사용할 수 있습니다 .

Python에서 Numba 성능 향상 테스트

Python의 간단한 런타임 개선 테스트를 살펴볼 시간입니다. 아래 코드는 더 빠른 Python 프로그램을 위해 Numba를 구현합니다.

import numpy as np

from numba import jit

import random
import time

def rand_events(n: int) -> np.ndarray:
    ls = np.zeros(n)
    for i in range(n):
        x = random.random()
        while True:
            y = random.random()
            if x < y: 
                ls[i] = y
                break
    return ls

""" RUNTIME TEST WITHOUT NUMBA  -------------------------- """

_start_time = time.time()
vals = rand_events(10000000)
_end_time = time.time()

print(str(_end_time - _start_time))

""" RUNTIME TEST WITH NUMBA ------------------------------ """

_start_time = time.time()
jit_rand_events = jit(nopython=True)(rand_events)
vals = jit_rand_events(10000000)
_end_time = time.time()

print(str(_end_time-_start_time))

_start_time = time.time()
vals = jit_rand_events(10000000)
_end_time = time.time()

print(str(_end_time-_start_time))

위의 코드에서 jit(nopython=True)를 호출하는 것은 @njit 선언자의 사용과 같습니다. 위의 코드를 실행할 때 터미널의 출력은 다음과 유사합니다(머신 및 난수 생성 결과에 따라 다름)

9.1829195022583 
1.2913379669189453 
0.8751001358032227

즉, n = 10,000,000인 rand_events() 함수를 호출하는 데 9.18초가 걸렸습니다. @njit 선언자를 적용하고 함수를 다시 실행하면 1.29초(함수 “지팅” 포함)만 걸립니다. @njit 선언자 를 호출하지 않으면 rand_events()의 “jitted” 버전을 호출하는 데 0.87초가 걸립니다. 이는 상당한 런타임 개선 사항입니다.

더 빠른 Python 시뮬레이션을 위해 Numba 적용

Numba는 시뮬레이션 프레임워크를 더 빠르게 만들 수 있습니다. 그러나 프레임워크의 주요 부분이 수치 지향적인 경우에만 가능합니다. 또한, 프레임워크는 numpy 를 통합해야 합니다. numa는 numpy 를 매우 잘 이해하기 때문입니다. 강력한 객체 지향 프레임워크에서는 이것이 문제가 될 수 있습니다. 그러나 코드의 계산 집약적인 부분을 숫자 코드로 변환할 수 있다면 number를 사용하면 Python 코드의 런타임이 크게 향상될 수 있습니다.

You May Also Like

Leave a Reply

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.