Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 벡터화(Vectorization) 완벽 가이드: 반복문 없이 배열 연산 속도 높이기

이번 글에서는 파이썬 3.x 환경에서 벡터화(Vectorization)를 구현하는 다양한 기법과 활용 방법을 살펴봅니다.

벡터화란 무엇인가?

벡터화는 반복문(loop)을 사용하지 않고 배열 연산을 처리하는 프로그래밍 기법입니다. 최적화된 함수를 활용하면 코드의 실행 시간과 연산 시간을 효율적으로 크게 줄일 수 있습니다. 벡터화에서는 배열 대신 벡터 단위로 다양한 연산을 수행하며, 대표적인 연산은 다음과 같습니다.

  • 내적(Dot Product · Scalar Product) – 두 벡터의 내적으로, 하나의 스칼라 값을 결과로 반환합니다.
  • 외적(Outer Product) – 벡터의 길이 × 길이 크기를 가지는 정방 행렬(square matrix)을 생성합니다.
  • 요소별 곱셈(Element-wise Multiplication) – 같은 인덱스의 요소끼리 곱하며, 행렬의 차원은 그대로 유지됩니다.

내적(Dot Product) 구현 예제

전통적인 반복문 방식과 NumPy의 벡터화 방식으로 각각 내적을 계산하고, 소요 시간을 비교해 보겠습니다.

import time
import numpy
import array

p = array.array('q')
for i in range(100000, 200000):
    p.append(i)

q = array.array('q')
for i in range(200000, 300000):
    q.append(i)

# 전통적인 반복문 방식의 내적 계산
tic = time.process_time()
dot_value = 0.0
for i in range(len(p)):
    dot_value += p[i] * q[i]
toc = time.process_time()
print("dot_product of vector arrays = " + str(dot_value))
print("Computation time taken = " + str(1000 * (toc - tic)) + "ms")

# NumPy 벡터화 방식의 내적 계산
n_tic = time.process_time()
n_dot_product = numpy.dot(p, q)
n_toc = time.process_time()
print("\nn_dot_product of vector arrays = " + str(n_dot_product))
print("Computation time taken = " + str(1000 * (n_toc - n_tic)) + "ms")

실행 결과

dot_product of vector arrays = 3833313333350000.0
Computation time taken = 116.51723400000068ms

n_dot_product of vector arrays = 3833313333350000
Computation time taken = 2.5412239999997865ms

실행 결과를 보면 반복문 방식에는 약 116ms가 걸린 반면, NumPy의 벡터화 연산은 약 2.5ms 만에 동일한 결과를 얻었습니다. 즉, 벡터화만으로 약 40배 이상의 성능 향상 효과를 확인할 수 있습니다.

주요 함수 살펴보기

예제와 함께 자주 사용되는 NumPy 관련 함수들을 정리하면 다음과 같습니다.

  • outer(a, b) – 두 개의 numpy 배열을 입력받아 두 벡터의 외적(outer product)을 반환합니다.
  • multiply(a, b) – 두 개의 numpy 배열을 입력받아 요소별 곱셈(element-wise multiplication) 결과를 반환합니다.
  • dot(a, b) – 두 개의 numpy 배열을 입력받아 두 배열의 내적(dot product)을 반환합니다.
  • zeros((n, m)) – 형태(shape)와 데이터 타입을 입력받아 해당 크기의, 0으로 초기화된 행렬을 생성합니다.
  • process_time() – 현재 프로세스의 시스템 CPU 시간과 사용자 CPU 시간의 합계를 소수 초 단위로 반환합니다. 단, sleep 상태에서 경과된 시간은 포함되지 않습니다.

마무리

이번 글에서는 파이썬에서 벡터화가 무엇인지, 그리고 반복문 대신 벡터화를 적용했을 때 연산 속도가 얼마나 개선되는지 확인했습니다. 대규모 수치 연산을 다룰 때는 NumPy의 벡터화 연산을 적극 활용하는 것이 코드의 가독성과 성능 모두에 큰 도움이 됩니다.