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과 같은 객체는 지원하지 않습니다.
'라이브러리' 카테고리의 다른 글
파이썬(Python) heapq 사용법 정리 (0) | 2023.03.02 |
---|---|
파이썬(Python) csv 사용법 정리 (0) | 2023.03.02 |
파이썬(Python) random 사용법 정리 (0) | 2023.03.01 |
파이썬(Python) itertools 사용법 정리 (0) | 2023.03.01 |
파이썬(Python) hashlib 사용법 정리 (0) | 2023.02.28 |