在内存视图上检查 文件:
Memyview 对象允许 Python 代码访问 对象,该对象支持缓冲区协议而无需复制。
类别 回忆录(obj)
创建一个引用 obj.obj 的内存视图,该视图必须支持 支持缓冲协议的内置对象 包括字节和字节数组。
然后给我们示例代码:
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
报价结束,现在让我们仔细看看:
>>> b = b'long bytes stream'
>>> b.startswith(b'long')
True
>>> v = memoryview(b)
>>> vsub = v[5:]
>>> vsub.startswith(b'bytes')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'memoryview' object has no attribute 'startswith'
>>> bytes(vsub).startswith(b'bytes')
True
>>>
因此,我从上面得出的结论是:
我们创建一个内存视图对象来公开缓冲区对象的内部数据 复制,但是,为了做任何有用的对象(通过调用方法 ) ,我们必须创建一个副本!
通常当我们有一个很大的对象时,会需要 memyview (或者旧的 buffer 对象) , 而且切片也可以很大,这就需要更高的效率 如果我们制作大片的切片,或者制作小片的切片,但是次数很多。
使用上面的方案,我不认为它对任何情况都有用,除非 有人能给我解释一下我错过了什么。
编辑1:
我们有大量的数据,我们希望通过从头到尾的推进来处理它 end, for example extracting tokens from the start of a string buffer until the buffer is consumed.In C term, this is advancing a pointer through the buffer, and the pointer can be passed 如何在 python 中实现类似的操作?
人们建议采取变通方法,例如,许多字符串和正则表达式函数采取了相应的立场
参数可以用来模拟推进指针。这里有两个问题: 第一
这是一个解决方案,您必须改变您的编码风格以克服缺点,并且
第二: 并非所有函数都有位置参数,例如正则表达式函数和 startswith
函数,encode()
/decode()
函数没有。
其他人可能建议以块的形式加载数据,或者以小的形式处理缓冲区 大于最大标记的部分。好的,我们知道这些可能性 但是我们应该以一种更自然的方式在 python 中工作 试图改变编码风格以适应语言,不是吗?
Edit2:
一个代码示例可以使事情变得更清楚。这就是我想要做的,也是我认为“记忆视图”第一眼就能让我做到的。让我们使用 pmview (适当的内存视图)来实现我想要的功能:
tokens = []
xlarge_str = get_string()
xlarge_str_view = pmview(xlarge_str)
while True:
token = get_token(xlarge_str_view)
if token:
xlarge_str_view = xlarge_str_view.vslice(len(token))
# vslice: view slice: default stop paramter at end of buffer
tokens.append(token)
else:
break