首页 > 解决方案 > 是否有从内存视图创建字节数组的零拷贝方式?

问题描述

我遇到了我认为将是一个非常简单的问题(我希望它是!),即从内存中取出原始数据,并将其解码为 Unicode 字符串。

这样做是显而易见的方法,并且有效:

the_string = mv.tobytes().decode("utf-8")

其中 mv 是有问题的内存视图。但这违背了零拷贝的目的,因为拷贝是由 tobytes() 方法生成的。所以接下来要尝试的是将内存视图“转换”为字节数组。换句话说,创建一个使用内存视图“mv”作为其支持数据的字节数组。我认为这很简单,但我不知道该怎么做。有没有人知道怎么做?

标签: pythonarraysbufferdecodememoryview

解决方案


答案codecs.decode在标准库中。

例如:

>>> b = "Hello 你好".encode("utf-8")
>>> b
b'Hello \xe4\xbd\xa0\xe5\xa5\xbd'

>>> m = memoryview(b)
>>> m.decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'memoryview' object has no attribute 'decode'

>>> import codecs
>>> codecs.decode(m, "utf-8")
'Hello 你好'
>>> codecs.decode(m[:-3], "utf-8")
'Hello 你'

推荐阅读