시뮬레이션 모델링의 필수 부분은 시뮬레이션 런타임입니다. 대규모 이산 이벤트 시뮬레이션 모델 과 중간 규모의 에이전트 기반 시뮬레이션 모델은 계산 리소스를 소비하고 런타임이 매우 길 수 있습니다. 소스 코드가 완전히 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 코드의 런타임이 크게 향상될 수 있습니다.
최적화 및 시뮬레이션을 전문으로하는 산업 엔지니어 (R, Python, SQL, VBA)
Leave a Reply