Python: размер строк в памяти - PullRequest
18 голосов
/ 25 февраля 2012

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

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

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

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

Ответы [ 2 ]

25 голосов
/ 25 февраля 2012

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

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

В качестве пояснения того, почему это может сэкономить память, рассмотрим следующее:

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

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

1 голос
/ 25 февраля 2012

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

Эти строки должны автоматически интернироваться при их наличии.

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