Я до сих пор не понимаю смысл представления о памяти

1

Я прочитал вопросы и ответы или Что именно точка памяти в Python. Я до сих пор не вижу смысла.

Пример в ответе кажется логичным сначала, но когда я memoryview третий тестовый пример, где я просматриваю объект 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

Один из аргументов состоял в том, что вы можете просто передать объект struct.unpack в struct.unpack. Но вы можете абсолютно сделать то же самое с байтовыми объектами. По моему мнению, это сводится к тому же, что и память, в конце концов, тоже нужно скопировать фрагмент.

Просто придерживаться байтов кажется намного проще, если вы не делаете глупостей.

Теги:
python-3.x
memoryview

1 ответ

1
Лучший ответ

Первые два теста, по сути, отгрызают один байт слева, пока ничего не осталось.

Для примера с bytes это делает N копий, для просмотра памяти никогда не существует копии, просто настройка длины представления

Ваш последний пример совсем не похож, вместо того, чтобы вырезать один байт, вы выкалываете постепенно большее количество байтов (b[1:] b[2:] b[3:]) - в конечном итоге строка исчерпаны, и вы нарезаете пустую строку (точнее, когда i * (i + 1)/2 > n). Например, с последовательностью в 100 000 байт вы делаете noops после 446 итераций.

  • 0
    Да, критическая точка в том, что в b = b[i+1:] , b и i оба меняются.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню