[python] 넘파이를 이용한 최적화

파이썬의 넘파이 라이브러리는 데이터 배열을 다루는데 뛰어난 성능을 보여줍니다. 하지만 때로는 코드를 더욱 최적화하여 더 빠른 실행 속도와 더 적은 메모리 사용량을 달성하고 싶을 때가 있습니다. 이 블로그 포스트에서는 넘파이를 사용하여 파이썬 코드를 최적화하는 방법에 대해 알아보겠습니다.

1. 넘파이의 벡터화 연산 활용

파이썬의 반복문보다는 넘파이의 벡터화 연산을 사용하는 것이 성능상 더 유리합니다. 넘파이는 데이터 배열에 대한 연산을 내부적으로 최적화하여 빠른 연산이 가능하도록 지원합니다.

import numpy as np

# 반복문을 사용한 연산
def square_loop(arr):
    result = np.zeros(arr.shape)
    for i in range(arr.shape[0]):
        for j in range(arr.shape[1]):
            result[i, j] = arr[i, j] ** 2
    return result

# 넘파이의 벡터화 연산 사용
def square_vectorized(arr):
    return arr ** 2

arr = np.array([[1, 2, 3], [4, 5, 6]])

# 성능 비교
%timeit square_loop(arr)
# Output: 20.7 µs ± 299 ns per loop (mean ± std. dev....)

%timeit square_vectorized(arr)
# Output: 1.83 µs ± 44.3 ns per loop (mean ± std. dev....)

위 코드에서는 넘파이의 벡터화 연산을 사용하여 배열 요소의 제곱을 계산하는 과정에서 반복문과 벡터화 연산의 성능을 비교하였습니다. 벡터화 연산을 사용한 경우에는 반복문을 사용한 경우보다 약 10배 가량 빠른 결과를 보여줍니다.

2. 넘파이 함수 활용

넘파이는 다양한 함수를 제공하며, 이러한 함수들을 사용하여 코드를 최적화할 수 있습니다. 예를 들어, sum, mean, max, min과 같은 집계 함수를 이용하면 반복문을 사용한 직접적인 구현보다 더 빠른 계산이 가능합니다.

arr = np.array([[1, 2, 3], [4, 5, 6]])

# 직접적인 계산
total = 0
for row in arr:
    for item in row:
        total += item

# 넘파이 함수 사용
total = np.sum(arr)

위 코드에서는 넘파이의 sum 함수를 사용하여 배열 요소의 합을 구하는 방법을 보여주고 있습니다. 넘파이 함수를 사용하는 것이 성능적인 측면에서 훨씬 유리합니다.

결론

넘파이는 매우 효율적인 성능을 가진 라이브러리이지만, 위와 같은 방법들을 활용하여 코드를 최적화함으로써 더욱 빠른 실행 속도와 더 적은 메모리 사용량을 달성할 수 있습니다. 추가적인 최적화 기법에 대해 더 알아보고 싶다면 넘파이 공식 문서를 참고하시기 바랍니다.