CPython 객체의 c-level 내부 buffer에 안전하게 접근할 수 있도록 하는 객체. 기존의 python operation에서 빈번히 발생하는 불필요한 복사의 과정 없이 직접적으로 객체를 사용하거나 수정할 수 있게 합니다.
파이썬 객체의 내부 데이터(byte-oriented array or buffer)에 직접 접근 가능한 것을 buffer protocol이라고 하는데, 마치 메모리 관리가 필요한 C/C++처럼 메모리 블럭에 대한 포인터처럼 사용할 수 있는 것을 말합니다.
memoryview를 통해 파이썬 객체를 c-level의 buffer structure로 전달할 수 있게 해줍니다.
byte_array = bytearray('XYZ', 'utf-8')
print('Before update:', byte_array)
mem_view = memoryview(byte_array)
# update 2nd index of mem_view to J
mem_view[2] = 74
print('After update:', byte_array)
memoryview는 string이나 bytearray를 인자로 받을 수 있습니다. memoryview 객체에서 직접적인 수정이 bytearray에서 반영됨을 위 예시 코드로부터 알 수 있습니다.
언제 쓰는가?
memory copy 과정을 생략한 채, 메모리 상의 bite 형식 데이터를 직접 읽고 쓸 수 있기 때문에 빠른 접근 및 수정이 가능도록 돕습니다. C수준의 완벽한 raw의 접근은 아니더라도 일정 수준의 memory bottleneck을 해결하기위해 쓰이는 것 같습니다.
대용량 array의 계산이 주된 목적인 numpy나 scipy같은 라이브러리가 빠르게 동작하는 이유도 buffer protocol과 크게 연관됩니다. C API에서 동일 메모리를 공유하며 기존 python list의 memory copy 과정을 생략하며 동작하기 때문입니다.
Numpy’s custom buffer protocol: https://github.com/numpy/numpy/blob/main/numpy/_core/src/multiarray/buffer.c
PEP-3118(buffer protocol): https://legacy.python.org/dev/peps/pep-3118/
조금 더 자세히 살펴보려면 위의 raw numpy 코드나 buffer protocol 도큐먼트도 참고할 수 있습니다.
'Study > Python' 카테고리의 다른 글
Pytorch 설치중 conflict 발생 (1) | 2025.02.02 |
---|---|
python pickle 사용하여 파이썬 객체 저장하고 불러오기 - 파이썬 객체의 직렬화 (0) | 2025.01.08 |
[ModuleNotFoundError: No module named 'yaml'] wandb import 중 발생한 경우 (0) | 2024.09.04 |