python - 我还是不明白内存观的意义

标签 python python-3.x memoryview

我通读了问题和答案或 What exactly is the point of memoryview in Python 。我还是没明白重点。

答案中的示例一开始似乎合乎逻辑,但是当我构建第三个测试用例时,我按索引扫描bytes对象,它与memoryview<一样快.

import time


# Scan through a bytes object by slicing
for n in (100000, 200000, 300000, 400000):
    data = b'x' * n
    start = time.time()
    b = data
    while b:
        b = b[1:]
    print('bytes sliced  ', n, time.time() - start)

# Scan through a bytes object with memoryview
for n in (100000, 200000, 300000, 400000):
    data = b'x' * n
    start = time.time()
    b = memoryview(data)
    while b:
        b = b[1:]
    print('memoryview    ', n, time.time() - start)

# Scan through a bytes object by index
for n in (100000, 200000, 300000, 400000):
    data = b'x' * n
    start = time.time()
    b = data
    for i in range(n):
        b = b[i+1:]
    print('bytes indexed ', n, time.time() - start)

输出:

bytes sliced   100000 0.16396498680114746
bytes sliced   200000 0.6180000305175781
bytes sliced   300000 1.541727066040039
bytes sliced   400000 2.8526365756988525
memoryview     100000 0.02300119400024414
memoryview     200000 0.04699897766113281
memoryview     300000 0.0709981918334961
memoryview     400000 0.0950019359588623
bytes indexed  100000 0.027998924255371094
bytes indexed  200000 0.05700063705444336
bytes indexed  300000 0.08800172805786133
bytes indexed  400000 0.1179966926574707

其中一个论点是,您可以简单地将内存 View 对象传递给struct.unpack。但你绝对可以对 bytes 对象做同样的事情。根据我的理解,它归结为与 MemoryView 最终也必须复制切片相同。

如果你不做愚蠢的事情,那么仅仅坚持使用字节似乎要简单得多。

最佳答案

您的前两个基准测试本质上是从左侧蚕食一个字节,直到没有任何剩余。

对于bytes例如,这会进行 N 次复制,对于 MemoryView 来说,永远不会有复制,只是 View 长度的调整

您的最后一个示例完全不相似,您不是蚕食单个字节,而是蚕食逐渐增加的字节数( b[1:] b[2:] b[3:] )--最终字符串耗尽,您将切片一个空字符串(更准确地说,当 i * (i + 1) / 2 > n 时)。例如,对于 100,000 字节序列,您将在 446 次迭代后执行 noop。

关于python - 我还是不明白内存观的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52573049/

相关文章:

python - 登录 Django 时帐户未进行身份验证

python - 对数间隔值低于 1

python - Mad Libs 游戏 Python 中多次出现同一个词

python - 在Opencv中将图像与深度图对齐

python - 如何展平深层字典;用方括号包围所有子字典键

python-3.x - 如何检查值是正数还是负数并在数据框的列中插入新值

python - 遍历 n 维数组的通用函数

python - 最后分层 K 折性能独特

python - 哪个更快 np.vstack、np.append、np.concatenate 或在 cython 中制作的手动函数?

python - 在 Python 中正确丢弃指向 mmap 内存的 ctypes 指针