Код: Выделить всё
from itertools import pairwise, chain
from random import choice
from string import ascii_lowercase
import tracemalloc
def measure_allocation():
s = [choice(ascii_lowercase) for _ in range(1_000_000)]
tracemalloc.start()
# HERE
res1 = tuple(['^']+s)
snapshot1 = tracemalloc.take_snapshot()
top_stats = snapshot1.statistics('lineno')
for stat in top_stats[:10]:
print(stat)
tracemalloc.stop()
print('*'*80)
tracemalloc.start()
# AND HERE
res2 = tuple(chain(['^'],s))
snapshot2 = tracemalloc.take_snapshot()
top_stats = snapshot2.statistics('lineno')
for stat in top_stats[:10]:
print(stat)
tracemalloc.stop()
if __name__ == "__main__":
import sys
print(sys.version)
print('*'*80)
measure_allocation()
Код: Выделить всё
3.12.6 (main, Sep 6 2024, 19:03:47) [GCC 13.3.0]
********************************************************************************
/tmp/tmp.MbQI2VsYCZ/foo.py:13: size=7813 KiB, count=1, average=7813 KiB
********************************************************************************
/tmp/tmp.MbQI2VsYCZ/foo.py:24: size=7813 KiB, count=1, average=7813 KiB
Просто чтобы прояснить, почему для меня это неожиданно, на мой взгляд, Python будет использовать res1:
- Сначала оцените внутреннее выражение ()
Код: Выделить всё
["^"] + s - Создайте в памяти новый список, который будет того же размера, что и s, поскольку размеры списка увеличиваются с увеличением фрагментов.
- На данный момент у нас есть и s, и временный список в памяти, поэтому использование памяти должно быть удвоено.
- Теперь мы выполняем итерацию и создаем кортеж temp< /code> удаляется.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-python
Мобильная версия