Vectorization in Python

Efficient Data Processing

파이썬에서 벡터화(Vectorization)는 반복문을 사용하는 대신 NumPy나 Pandas와 같은 라이브러리를 활용하여 데이터 전체에 대한 연산을 한 번에 수행하는 방식이다. 벡터화된 연산은 C로 작성된 최적화된 코드를 사용하므로 일반 Python 반복문보다 훨씬 빠르며, 코드가 더 간결해지고 메모리 사용이 효율적이며 내부적으로 병렬 처리를 활용할 수 있다는 장점이 있다.

Engineering
저자

Kwangmin Kim

공개

2023년 07월 01일

1 Vectorization

파이썬에서도 R과 마찬가지로 벡터화(vectorization)가 존재한다. 벡터화는 파이썬에서 반복문을 사용하는 대신 NumPy나 Pandas와 같은 라이브러리를 활용하여 데이터 전체에 대한 연산을 한 번에 수행하는 방식이다.

1.1 벡터화의 정의

벡터화는 데이터의 각 요소에 대해 반복적으로 함수를 적용하는 대신, 전체 데이터 배열에 한 번에 연산을 적용하는 것을 의미한다. 예를 들어 filtered_data.apply(lambda x: np.abs(x).mean())와 같은 코드는 각 열에 대해 벡터화된 연산을 수행한다.

1.2 벡터화의 장점

  1. 성능 향상: 파이썬의 for 루프는 상대적으로 느리지만, 벡터화된 연산은 C로 작성된 최적화된 코드를 사용하므로 훨씬 빠르다.

  2. 코드 간결성: 벡터화를 사용하면 코드가 더 짧고 읽기 쉬워진다.

  3. 메모리 효율성: 벡터화된 연산은 메모리 사용을 최적화하여 중간 결과를 저장하기 위한 추가 메모리가 적게 필요하다.

  4. 병렬 처리 활용: 벡터화된 연산은 내부적으로 병렬 처리를 활용하여 성능을 향상시킬 수 있다.

1.3 벡터화하지 않은 코드 vs 벡터화한 코드

벡터화하지 않은 코드:

if not filtered_data.empty:
    length = len(filtered_data)
    absolute_means = {}
    squared_means = {}
    
    for column in filtered_data.columns:
        abs_sum = 0
        squared_sum = 0
        for value in filtered_data[column]:
            abs_sum += abs(value)
            squared_sum += value ** 2
        
        absolute_means[column] = abs_sum / length
        squared_means[column] = squared_sum / length

벡터화한 코드:

absolute_means = filtered_data.apply(lambda x: np.abs(x).mean())
squared_means = filtered_data.apply(lambda x: (x ** 2).mean())

이 코드는 명시적인 반복문을 사용하므로 대용량 데이터셋에서는 벡터화된 버전보다 훨씬 느리게 실행된다.

Subscribe

Enjoy this blog? Get notified of new posts by email: