응 아니야

변역글 - 링크

원문글 - 링크

 

아래는 파이썬 numba를 활용한 코드와 CHAT-GPT4의 해설이다.

 

# code

import math
from time import perf_counter
from numba import njit, prange

@njit(fastmath=True, cache=True)
def is_prime(num):
    if num == 2:
        return True
    if num <= 1 or not num % 2:
        return False
    for div in range(3,int(math.sqrt(num)+1),2):
        if not num % div:
            return False
    return True

@njit(fastmath=True, cache=True,parallel=True)
def run_program(N):
    for i in prange(N):
        is_prime(i)

if __name__ == '__main__':
    N = 10000000000000000000
    start = perf_counter()
    run_program(N)
    end = perf_counter()
    print(end - start)

 

해설


이 코드는 주어진 숫자 N까지의 모든 정수 중에서 소수(prime number)를 찾는 파이썬 스크립트입니다.

코드를 자세히 살펴보면:
    1. `is_prime(num)` 함수: 이 함수는 주어진 숫자 `num`이 소수인지 아닌지를 판단합니다. 2는 소수이므로 True를 반환하고, 1이하의 수나 짝수는 소수가 아니므로 False를 반환합니다. 그 외의 경우에는 3부터 `num`의 제곱근까지의 범위에서 2씩 증가하는 수를 나누어 떨어지는지 확인합니다. 나누어 떨어지는 경우 소수가 아니므로 False를 반환하고, 나누어 떨어지지 않는 경우 소수이므로 True를 반환합니다.

    2. `run_program(N)` 함수: 이 함수는 0부터 주어진 숫자 N까지의 모든 정수에 대해 `is_prime(i)` 함수를 실행합니다. 여기서 `prange(N)`은 병렬 처리를 지원하는 range 함수로, 숫자 N까지의 범위를 병렬로 처리하게 됩니다.

    3. `if __name__ == '__main__':` 부분: 이 부분은 스크립트가 직접 실행될 때만 동작하는 부분입니다. 여기서는 주어진 숫자 N까지의 모든 정수 중에서 소수를 찾는데 걸리는 시간을 측정합니다. `perf_counter()` 함수를 이용해 `run_program(N)` 함수를 실행하기 전과 후의 시간을 측정하고, 그 차이를 출력하여 소수를 찾는데 걸리는 시간을 알려줍니다.

이 코드에서는 Numba 라이브러리를 사용하여 성능을 개선했습니다. `@njit` 데코레이터는 Numba의 Just-In-Time(JIT) 컴파일러를 사용하도록 함수에 지시하며, 이를 통해 파이썬 코드의 실행 속도를 크게 향상시킬 수 있습니다. `fastmath=True`는 수학 연산 최적화를, `cache=True`는 컴파일된 함수의 캐시를 사용하여 성능을 개선하도록 지시하며, `parallel=True`는 병렬 처리를 지원하도록 합니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band