我仍然不明白MemoryView的意义

时间:2018-09-29 22:27:10

标签: 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

其中一个参数是,您可以简单地将memoryview对象传递给struct.unpack。但是,您绝对可以对bytes对象执行相同的操作。以我的理解,它可以归结为与memoryview最终也必须复制切片相同的内容。

如果您不做愚蠢的事情,那么坚持字节就这么简单。

1 个答案:

答案 0 :(得分:1)

您的前两个基准实质上从左边开始对一个字节进行蚕食,直到没有剩余。

对于bytes示例,此操作进行了N次复制,对于memoryview,从不存在复制,只是调整视图的长度

您的最后一个示例根本不相似,而不是蚕食单个字节,而是蚕食了越来越多的字节(b[1:] b[2:] {{ 1}})–最终字符串被用尽,您正在对一个空字符串进行切片(更确切地说是b[3:]时)。例如,对于100,000个字节的序列,您要在446次迭代后执行noop。