相关疑难解决方法(0)

Python中的memoryview究竟是什么意思

检查内存视图上的文档:

memoryview对象允许Python代码访问支持缓冲区协议的对象的内部数据而无需复制.

class memoryview(obj)

创建一个引用obj的内存视图.obj必须支持缓冲协议.支持缓冲区协议的内置对象包括bytes和bytearray.

然后我们给出示例代码:

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

报价结束,现在让我们仔细看看:

>>> 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
>>> 
Run Code Online (Sandbox Code Playgroud)

所以我从上面收集的内容:

我们创建一个memoryview对象来公开缓冲区对象的内部数据而不进行复制,但是,为了对对象做任何有用的事情(通过调用对象提供的方法),我们必须创建一个副本!

当我们有一个大对象时,通常需要memoryview(或旧的缓冲区对象),并且切片也可能很大.如果我们正在制作大切片,或者制作小切片但需要很多次,则需要提高效率.

有了上述方案,我看不出它对两种情况都有用,除非有人能向我解释我在这里缺少的东西.

EDIT1:

我们有大量数据,我们希望通过从头到尾推进它来处理它,例如从字符串缓冲区的开头提取标记,直到缓冲区被消耗.在C语言中,这是推进指针通过缓冲区,指针可以传递给任何期望缓冲区类型的函数.如何在python中完成类似的事情?

人们建议使用变通方法,例如许多字符串和正则表达式函数采用可用于模拟推进指针的位置参数.这有两个问题:首先是一个解决方法,你被迫改变你的编码风格来克服缺点,第二个:并非所有函数都有位置参数,例如正则表达式函数和startswithdo,encode()/ …

python buffer memoryview

68
推荐指数
3
解决办法
3万
查看次数

在Python中切片列表而不生成副本

我有以下问题.

给定一个整数列表L,我需要生成所有子列表L[k:] for k in [0, len(L) - 1],而不生成副本.

我如何在Python中实现这一目标?以某种方式使用缓冲对象?

python list slice

65
推荐指数
4
解决办法
3万
查看次数

Python是否对字符串进行逐个引用?

我想知道我什么时候做的事情

a = "This could be a very large string..."
b = a[:10]
Run Code Online (Sandbox Code Playgroud)

创建一个新字符串或返回一个视图/迭代器

python string

26
推荐指数
1
解决办法
4350
查看次数

标签 统计

python ×3

buffer ×1

list ×1

memoryview ×1

slice ×1

string ×1