求解释一下python中bytearray和memoryview 的使用 以及适用的场景
PHPz
PHPz 2017-04-18 10:00:13
0
1
599

x = bytearray(b'abcde')
y = memoryview(x)
y[1:3] = b'yz'
x[1:3] = b'ab'
y[3] = ord(b'e')
x[3] = ord(b'f')

x = bytearray(b'abcde')
while len(x)>0:
x = x[1:]

x = bytearray(b'abcde')
y = memoryview(x)
while len(y)>0:
y = y[1:]

PHPz
PHPz

学习是最好的投资!

모든 응답(1)
小葫芦

최근에 저는 이 질문에 답하기 위해 memoryview를 사용했습니다.

Bytearray는 Python2의 str에 상대적인 변경 가능한 바이트 시퀀스이지만 str은 변경할 수 없습니다.
Python3에서는 str이 기본적으로 유니코드 인코딩이므로 bytearray를 통해 바이트 단위로만 접근할 수 있습니다.

Memoryview는 버퍼 프로토콜[1,2]을 지원하는 개체에 대해 바이트 단위 메모리 액세스 인터페이스를 제공합니다.
기본 str 및 bytearray는 버퍼 프로토콜을 지원합니다.
다음 두 가지 동작 비교:
간단히 말하면 str과 bytearray의 슬라이싱 작업은 새로운 슬라이스 str과 bytearray를 생성하고 데이터를 복사하지만 memoryview를 사용한 후에는 발생하지 않습니다.

  1. 메모리뷰를 사용하지 마세요

    으아악
  2. 메모리뷰 사용

    으아악

내 사용 시나리오는 네트워크 프로그램의 소켓 수신 및 데이터 분석입니다.

  1. memoryview를 사용하기 전 양말 수신 코드는 다음과 같이 단순화됩니다

    정의 읽기(크기):

    으아악
  2. meoryview를 사용한 후에는 지속적인 문자열 연결과 새로운 객체 생성을 피할 수 있습니다

    으아악

    memoryview를 반환하는 것은 또 다른 장점이 있습니다. unpack 구문 분석을 위해 struct를 사용할 때 memoryview 객체를 직접 수신할 수 있는데, 이는 매우 효율적입니다(대규모 str을 세그먼트로 구문 분석할 때 많은 수의 슬라이싱 작업을 피함).

예:

으아악

[1] https://jakevdp.github.io/blo...
[2] http://legacy.python.org/dev/...

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿