본문 바로가기

라이브러리

파이썬(Python) memoryview 사용법 정리

memoryview는 Python에서 제공하는 내장 라이브러리로, 다양한 데이터 유형의 메모리 버퍼에 대한 안전한 접근 방법을 제공합니다. 이를 통해 C 언어와 같은 저수준의 메모리 조작을 수행할 수 있습니다.

1. 사용법

1) memoryview 객체 생성

memoryview 객체는 bytearray, bytes, array.array 등의 객체로부터 생성할 수 있습니다.

>>> x = bytearray(b'Hello, world!')
>>> mv = memoryview(x)
>>> mv
<memory at 0x7f9145e51450>

2) memoryview 객체의 슬라이싱

memoryview 객체는 슬라이싱을 통해 부분 메모리 버퍼를 추출할 수 있습니다.

>>> mv[2:9]
<memory at 0x7f9145e51950>
>>> mv[2:9].tobytes()
b'llo, wo'

3) memoryview 객체의 읽기 및 쓰기

memoryview 객체는 읽기 및 쓰기 작업이 모두 가능합니다.

>>> mv[0]
72
>>> mv[0] = 74
>>> x
bytearray(b'Jello, world!')

4) memoryview 객체를 이용한 C 언어와의 상호 운용

memoryview 객체는 C 언어와의 상호 운용을 지원합니다. ctypes 모듈을 이용해 C 함수를 호출하고 memoryview 객체를 인자로 전달할 수 있습니다.

# C 함수 정의
lib = ctypes.cdll.LoadLibrary('libc.so.6')
memcpy = lib.memcpy
memcpy.restype = ctypes.c_void_p
memcpy.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_size_t]

# memoryview 객체 생성
x = bytearray(b'Hello, world!')
mv = memoryview(x)

# C 함수 호출
dst = bytearray(len(x))
memcpy(dst, mv, len(x))
print(dst)

2. 장점

1) 메모리 관리 용이성

memoryview는 다양한 데이터 유형의 메모리 버퍼에 대한 안전한 접근 방법을 제공합니다. 이를 통해 C 언어와 같은 저수준의 메모리 조작을 수행할 수 있으며, 이는 성능 향상에 큰 도움이 됩니다.

2) 메모리 사용량 절감

memoryview는 슬라이싱을 통해 부분 메모리 버퍼를 추출할 수 있습니다. 이를 이용하면 메모리 사용량을 절감할 수 있습니다. 예를 들어, 10GB의 파일에서 특정 구간만 읽어들일 경우, 전체 파일을 메모리에 로딩하지 않고 memoryview를 이용해 필요한 구간만 읽어들일 수 있습니다.

3) 상호 운용성

memoryview는 C 언어와의 상호 운용을 지원합니다. 이를 이용하면 Python과 C 언어 간의 데이터 교환을 용이하게 할 수 있습니다.

3. 단점

1) 복사 오버헤드

memoryview는 복사가 발생할 경우, 메모리 복사 오버헤드가 발생할 수 있습니다. 이를 해결하기 위해선 C언어와 같은 포인터 사용 방식을 사용해야 합니다.

2) 한계

memoryview는 일부 데이터 유형에 대해서만 지원합니다. bytearray, bytes, array.array 등의 객체만 지원하며, list나 tuple과 같은 객체는 지원하지 않습니다.