Fluent Python 2장

Lee DoYeon·2023년 3월 11일
1

2장_Memoryview

memoryview


메모리뷰가 뭔지 몰라서 계속 검색해보다가 꽤나 지식을 확장한 느낌으 들었다.

우선 메모리뷰의 역할은 파이썬에서 바이트(byte) 데이터에 대한 접근을 제공하는 객체이다.
memoryview 객체는 다른 바이트 형식의 객체, 예를 들어 bytes, bytearray, 직접 작성된 바이트와 같은 객체에 대한 뷰를 제공한다. memoryview 객체를 사용하면, 객체 내에서의 바이트를 직접 접근하고 수정할 수 있으며, 이를 통해 효율적인 바이트 관리와 처리를 가능하게 만든다.

  • 나는 여기서 의문점이 들었다. 바이트 객체가 무엇이고 바이트 객체를 왜 사용하는지? 이점이 있나??

바이트 객체는 말 그대로 데이터 형식이 바이트 단위로 구성된 객체를 의미한다.

예시로 보여준다면 이렇게 바이트 객체를 생성할 수 있다.

b = bytes([0x41, 0x42, 0x43])
  • 아니 그러면 왜 바이트 단위로 데이터를 저장하는건지 사실 이해가 안갔다. 그런데 찾아보니까 이해가 간다.

바이트 객체를 사용하면 이점은 아래와 같다.

  1. 표준화: 바이트 형식은 컴퓨터에서 구조화된 데이터를 표준화하는 데 많이 사용된다. 따라서, 바이트 형식으로 저장된 데이터는 다양한 플랫폼에서 쉽게 공유 및 처리할 수 있다.
  2. 효율성: 바이트 형식으로 데이터를 저장하면, 데이터 크기를 줄일 수 있으며, 처리 속도도 빠르다.
  3. 간결성: 바이트 형식으로 데이터를 저장하면, 데이터를 저장하는데 필요한 저장 공간이 줄어들고, 데이터 전송 또한 빠르게 이루어진다.
  • 그럼 다시 원점으로 돌아와서 memoryview를 사용하는 이유가 뭘까 생각해 봤다.

memoryview객체를 사용하여 바이트 데이터를 가져와 특정 위치에서의 데이터를 추출하거나 데이터를 수정할 수 있다. memoryview 객체를 사용하면, 바이트 객체와 같은 메모리 위치에서의 데이터를 직접 접근할 수 있으므로, 연산 속도가 높아지고 메모리 사용량이 줄어드는 효과를 볼 수 있다.

여기서 메모리는 여러번 중복해서 참조가 가능하다.

  • 그렇다면 memoryview는 언제 사용하는걸까?
  1. 바이트 배열을 공유하는 경우: memoryview 객체를 사용하면 동일한 바이트 배열의 복사본을 만들 필요 없이 바이트 데이터를 공유할 수 있다
  2. 바이트 데이터를 효율적으로 처리하는 경우: memoryview객체는 파이썬의 내장 메모리 관리 기술을 이용해 바이트 데이터를 효율적으로 처리할 수 있다. 메모리 뷰를 사용하면 데이터를 복사할 필요 없이, 데이터에 직접 접근할 수 있어 처리 속도가 향상된다.
  3. 바이트 데이터에 대한 작업을 수행하는 경우: memoryview 객체를 사용하면 바이트 데이터에 대한 여러 종류의 작업을 수행할 수 있다. 예를 들어, 바이트 데이터의 특정 부분을 슬라이싱하거나, 바이트 데이터의 특정 위치에서 특정 타입의 값을 읽을 수 있다.

질문

오늘 파이썬에서 memoryview에 대해서 잠깐 공부했다.
메모리뷰의 역할은 파이썬에서 바이트(byte) 데이터에 대한 접근을 제공하는 객체이다. memoryview 객체를 사용하면, 객체 내에서의 바이트를 직접 접근하고 수정할 수 있으며, 이를 통해 효율적인 바이트 관리와 처리를 도와준다고 공부했다. 그럼 저는 여기서 질문이 생겼다. 데이터를 왜 바이트 형식으로 저장하는지 궁금증이 생겼다. 그 해답은 구글링을 통해서 궁금증이 풀렸다.

바이트 형식으로 저장 시 표준화, 효율성, 간결성의 이점이 있다고 이해했다.

하지만 나에게 다시 궁금증이 생겼다. 바이트 형식의 데이터를 어디서 이용하는지 궁금해졌다.

답변

일반적으로 CPU가 Word라는 단위를 기준으로 연산을 처리합니다. 보통 4바이트 또는 8바이트 이구요. 아마 수업시간에 들어봤을 거에요.
그래서 바이트 형식은 컴퓨터가 데이터를 사용하는 방식과 같습니다. 그래서 사실 모든 저장된 데이터는 모두 바이트 형식으로 저장되어 있습니다. 해당 데이터도 어쨋든 컴퓨터가 사용하는 단위로 저장되어야 하니까요. 다만, 우리가 사람이 읽기 편한 문자를 바이트로 표현한거라서, 예를들어 어떤 데이터를 txt로 저장하고, 그 글자를 표현한 바이트를 사람이 보기 편하게 해주는 프로그램을 통해서 우리가 읽을 수 있겠죠. 예를들어, 'A'라는 문자의 ASCII 코드가 있을 것이고, 그것의 Byte 표기가 있을 거에요. 'A'라는 문자 하나를 메모장열고 저장시킨 후, 바이트 단위로 읽어서 출력한다면 해당 컴퓨터가 'A'를 어떻게 바이트로 표현하는지 알 수 있을것입니다.

여튼 바이트 형식의 데이터라고 부르는 것은 보통 이러한 사람이 읽기 쉬운 표현 방식을

쓰지 않은 것을 바이트 형식이라고 부릅니다. (또는 어떤 프로그램의 특수한 문제를 처리하기 위한 파일등의 경우)예를들어 제 프로그램상 어떤 한 클래스의 메모리 데이터가 선형상에 10~100까지의 주소사이에 있다고 가정했을 때, 거기에 있는 바이트값들을 그냥 파일에다가 쓸 수 있겠죠. 그리고 필요하다면 그 바이트값들을 그대로 읽어와 해당 클래스를 그대로 인스턴싱 할 수 있을 거에요.이 덕분에 효율성과 간결성이 있습니다.여기에 표준화가 생기려면 규칙성에 부여해야 하고 소위 말하는 Specification, Document 등을 통해 많은 사람들이 그 규칙성을 따라하도록 해야 생깁니다.바이트 형식과 반대되는 것은 JSON을 생각해볼 수 있을 거에요. (다만 위에서 설명했듯이 JSON도 당연히 컴퓨터에 저장되기 때문에 바이트 단위로 저장됩니다) Human Readable한 파일로 작성하게  합니다. 명세서가 있기에 표준화가 되어있구요. JSON은 파싱을 (구조를 파악하여 필요한 것들을 가져오는 것) 해야하기 때문에 아까 위에서 말한 어떤 클래스 메모리를 바로 파일에 써서 로드하는 것과는 하나의 절차가 추가가 되기 때문에, 효율성이나 간결성 면에서는 떨어지겠죠. 즉, 파싱 -> 데이터 구성 -> 클래스 구성 이렇게 절차가 구성되니까요.

그래서 어디서 사용하는지에 답변은 이러한 human readable한 파일이 필요없고, 빠르게 파일을 불러와서 처리하고 싶은 곳 어디에서나 사용가능합니다.

profile
I can do this all day

1개의 댓글

comment-user-thumbnail
2023년 5월 30일

열심히 하는 모습이 멋져요!

답글 달기