본문 바로가기
카테고리 없음

Python의 memoryview와 cast() 활용

by redcubes 2025. 3. 10.

Python의 memoryviewcast() 활용

1. memoryview란?

memoryview는 파이썬에서 제공하는 강력한 기능 중 하나로, bytes 또는 bytearray 같은 바이너리 데이터를 복사 없이 조작할 수 있도록 해줍니다.

이 기능을 사용하면 데이터의 복사를 최소화하여 성능을 최적화할 수 있습니다.

예제 1: 기본적인 memoryview 사용

data = bytearray([0, 10, 20, 30, 40, 50])
view = memoryview(data)
print(view[1])  # 10
view[1] = 100
print(data)  # bytearray(b'\x00d\x14\x1e(2')
    

2. cast()를 활용한 데이터 변환

memoryviewcast() 메서드를 사용하면 데이터의 형태를 변경할 수 있습니다.

예제 2: cast()를 사용하여 데이터 형태 변환

import struct

data = struct.pack("i", 12345)  # 4바이트 정수 데이터를 바이너리로 변환
view = memoryview(data).cast("B")  # 1바이트 배열로 변환
print(list(view))  # [57, 48, 0, 0] (리틀 엔디언 기준)
    

3. 활용 사례

3.1 대용량 데이터 처리

데이터를 복사하지 않고 직접 수정할 수 있으므로 대용량 데이터 처리에서 유용합니다.

예를 들어, 이미지 데이터를 변환할 때 메모리 효율성을 높일 수 있습니다.

import numpy as np

data = np.random.randint(0, 255, (1000, 1000), dtype=np.uint8)
view = memoryview(data)

# 특정 영역의 값을 변경 (메모리 복사 없이 수행)
view_cast = view.cast('B', shape=(1000000,))
view_cast[::2] = 255  # 짝수 인덱스의 픽셀을 흰색으로 변경
    

3.2 네트워크 패킷 분석

네트워크 프로그래밍에서 바이너리 데이터를 직접 조작할 때 매우 편리합니다.

import socket

def receive_data(sock):
    data = sock.recv(1024)  # 1024 바이트 데이터 수신
    view = memoryview(data)
    header = view[:4].cast("I")[0]  # 첫 4바이트를 정수로 변환
    print(f"Packet Header: {header}")
    return data
    

3.3 파일 I/O 최적화

파일 데이터를 memoryview로 읽어 들이면 불필요한 복사를 줄일 수 있습니다.

with open("large_file.bin", "rb") as f:
    buffer = memoryview(f.read())
    print(buffer[:10])  # 처음 10바이트 출력
    

3.4 Raspberry Pi 및 임베디드 시스템에서의 활용

리소스가 제한적인 환경에서 데이터 처리를 최적화할 때 매우 유용합니다.

예를 들어, 센서 데이터 스트리밍 시 메모리 복사를 최소화하여 성능을 높일 수 있습니다.

import struct

def process_sensor_data(raw_data):
    view = memoryview(raw_data)
    temp = struct.unpack("f", view[:4])[0]  # 4바이트를 float으로 변환
    humidity = struct.unpack("f", view[4:8])[0]
    return temp, humidity

sensor_data = struct.pack("ff", 22.5, 65.2)
print(process_sensor_data(sensor_data))  # (22.5, 65.2)
    

4. 결론

memoryviewcast()를 적절히 활용하면 데이터 복사를 최소화하고 성능을 최적화할 수 있습니다.

특히, 네트워크 프로그래밍, 파일 처리, 대용량 데이터 조작, 임베디드 시스템에서 매우 유용하므로 적극적으로 활용해 보세요!