Как обрабатывается память для промежуточных значений в Python?Python

Программы на Python
Ответить
Anonymous
 Как обрабатывается память для промежуточных значений в Python?

Сообщение Anonymous »

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

Код: Выделить всё

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> удаляется.
Однако результаты показали, что нам нужно было использовать malloc только для кортежа, а не для промежуточного списка.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»