gpt4 book ai didi

python - Python的MemoryView底层机制

转载 作者:行者123 更新时间:2023-12-01 02:38:19 25 4
gpt4 key购买 nike

据说 Python 的内存 View 在切片时不会复制数据。完成了许多基准测试,其中一些是在 stackoverflow 上进行的,“证明”这种行为。

在试图干扰他们时,我遇到了一种我无法解释的奇怪行为:

>>> arr = bytearray(range(0,15))
>>> mem = memoryview(arr)
>>> mem[5:15] = mem[0:10]
>>> arr
bytearray(b'\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04\x05\x06\x07\x08\t')

一方面,memoryview“不”复制数据。另一方面,这非常有效!

虽然我很高兴它“有效”,但我对它有效这一事实感到悲伤。嗯...因为它不应该。

如果 Python 有 1 个字符的缓冲区,结果应该是这样的:

bytearray(b'\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04')

基本上,在写入第 5 个字符后,它应该重叠并读取之前写入的第一个字符。这种简单方法的一个例子:

>>> for i in range(10):
... m[i+5] = m[i]
>>> a
bytearray(b'\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04\x00\x01\x02\x03\x04')

我尝试将内存 View 大小增加到很大,但它仍然有效,这意味着 python 在后台复制数据,使内存 View 对象变得毫无意义。

我这里有什么错误的地方吗?有什么解释吗?那么 MemoryView 是如何工作的呢?

最佳答案

It checks for that:

    if (dptr + size < sptr || sptr + size < dptr)
memcpy(dptr, sptr, size); /* no overlapping */
else
memmove(dptr, sptr, size);

memmove 被指定为对于重叠源和目标是安全的。确保安全的方式因情况和实现而异,但一种技术是从右到左工作,而不是从左到右工作,因为从左到右会覆盖尚未复制的数据。

关于python - Python的MemoryView底层机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45991099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com