Подтвердить что ты не робот

Python: размер строк в памяти

Рассмотрим следующий код:

arr = []
for (str, id, flag) in some_data:
    arr.append((str, id, flag))

Представьте, что входные строки имеют длину 2 символа в среднем и 5 символов max и некоторые_даты, имеющие 1 миллион элементов. Какова будет потребность в памяти такой структуры?

Может быть, много памяти потрачено впустую для строк? Если да, то как я могу избежать этого?

4b9b3361

Ответ 1

В этом случае, поскольку строки довольно короткие, и их так много, вы сохраняете справедливый бит памяти, используя intern по строкам. Предполагая, что в строках есть только строчные буквы, 26 * 26 = 676 возможных строк, поэтому в этом списке должно быть много повторений; intern гарантирует, что эти повторения не приведут к уникальным объектам, но все относятся к одному и тому же базовому объекту.

Возможно, что Python уже ставит короткие строки; но, глядя на несколько разных источников, кажется, что это сильно зависит от реализации. Поэтому вызов intern в этом случае - это, вероятно, путь; YMMV.

Как вопрос о том, почему это очень вероятно, чтобы сохранить память, рассмотрите следующее:

>>> sys.getsizeof('')
40
>>> sys.getsizeof('a')
41
>>> sys.getsizeof('ab')
42
>>> sys.getsizeof('abc')
43

Добавление одиночных символов в строку добавляет только байт к размеру самой строки, но каждая строка занимает 40 байтов сама по себе.

Ответ 2

Если ваши строки настолько коротки, вероятно, будет значительное количество дубликатов. Python interning будет оптимизировать его так, чтобы эти строки сохранялись только один раз, а ссылка использовала несколько тим, а не сохраняла строку несколько раз...

Эти строки должны быть автоматически интернированы, как есть.