当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python memoryview用法及代码示例


用法:

class memoryview(object)

创建一个引用 objectmemoryviewobject 必须支持缓冲协议。支持缓冲区协议的内置对象包括 bytesbytearray

memoryview 具有 element 的概念,它是由原始 object 处理的原子内存单元。对于许多简单类型,例如 bytesbytearray ,一个元素是单个字节,但其他类型,例如 array.array 可能有更大的元素。

len(view) 等于 tolist 的长度。如果 view.ndim = 0 ,则长度为 1。如果 view.ndim = 1 ,则长度等于视图中的元素数。对于更高维度,长度等于视图的嵌套列表表示的长度。 itemsize 属性将为您提供单个元素中的字节数。

memoryview 支持切片和索引以公开其数据。一维切片会产生一个子视图:

>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'

如果 format 是来自 struct 模块的本机格式说明符之一,则还支持使用整数或整数元组进行索引,并返回具有正确类型的单个 element。一维内存视图可以用整数或one-integer 元组索引。多维内存视图可以用正好ndim整数的元组索引,其中ndim是维数。零维内存视图可以用空元组索引。

这是一个非字节格式的示例:

>>> import array
>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
>>> m = memoryview(a)
>>> m[0]
-11111111
>>> m[-1]
44444444
>>> m[::2].tolist()
[-11111111, -33333333]

如果底层对象是可写的,则 memoryview 支持一维切片分配。不允许调整大小:

>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
False
>>> v[0] = ord(b'z')
>>> data
bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
bytearray(b'z123fg')
>>> v[2:3] = b'spam'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
bytearray(b'z1spam')

具有“B”、‘b’ or ‘c’ 格式的可散列(只读)类型的一维内存视图也是可散列的。哈希定义为 hash(m) == hash(m.tobytes())

>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
True
>>> hash(v[2:4]) == hash(b'ce')
True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
True

在 3.3 版中更改:现在可以对一维内存视图进行切片。格式为“B”、‘b’ or ‘c’ 的一维内存视图现在是可散列的。

在 3.4 版中更改:memoryview 现在自动注册collections.abc.Sequence

在 3.5 版中更改:memoryviews 现在可以用整数元组索引。

memoryview 有几种方法:

还有几个可用的只读属性:

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 memoryview。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。