Я до сих пор не понимаю смысл представления о памяти
Я прочитал вопросы и ответы или Что именно является точкой зрения на память в 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
Одним из аргументов было то, что вы можете просто передать объект struct.unpack
, Но вы можете сделать то же самое с байтовыми объектами. В моем понимании это сводится к тому же, что и вид памяти, в конце концов, тоже должен копировать срез.
Просто придерживаться байтов кажется намного проще, если вы не делаете глупостей.
1 ответ
Ваши первые два теста по существу отрезают один байт слева до тех пор, пока ничего не останется.
Для bytes
например, это делает N копий, для памяти никогда не бывает копии, просто корректировка длины представления
Ваш последний пример совсем не похож, вместо того, чтобы откусить один байт, вы откусите все большее число байтов (b[1:]
b[2:]
b[3:]
) - в конце концов строка исчерпана, и вы нарезаете пустую строку (точнее, когда i * (i + 1) / 2 > n
). Например, с последовательностью в 100000 байтов вы выполняете noops после 446 итераций.