Почему в Python кортеж целых чисел занимает меньше места, чем отдельные целые числа?

#python #sizeof #tuples

#python #sizeof #кортежи

Вопрос:

Вот пример со случайными целыми числами:

 a, b, c, d = 79412623, 56529819571, 10431, 30461
t = (79412623, 56529819571, 10431, 30461)
  

И их размеры:

 import sys
sys.getsizeof(t) # 88
aa, bb, cc, dd = sys.getsizeof(a), sys.getsizeof(b), sys.getsizeof(c), sys.getsizeof(d)
sum([aa,bb,cc,dd]) # 96
  

Почему кортеж занимает меньше места?

Комментарии:

1. Возможно, захочется sum(map(sys.getsizeof, (a,b,c,d))) в следующий раз. Повторяющийся текст становится неуклюжим по многим причинам, например, здесь строка была слишком широкой.

Ответ №1:

Число, возвращаемое sys.getsizeof , не включает размер объектов, содержащихся в контейнере.

 >>> sys.getsizeof({1:2})
280
>>> sys.getsizeof({'a_really_long_string_that_takes_up_lots_of_space':'foo'})
280
  

Комментарии:

1. Чтобы подробнее остановиться на этом, это потому, что контейнеры просто содержат ссылки. Python не передает сами объекты и не имеет понятия «примитивных типов», как Java; но некоторые модули хранят значения вместо ссылок на объекты, такие как array и numpy.

Ответ №2:

Я работаю над 32-разрядной Windows XP с Python 2.6.2, и я попробовал ваш код, который выглядит следующим образом:

В [15]: a, b, c, d =79412623, 56529819571, 10431, 30461

В [16]: t=(79412623, 56529819571, 10431, 30461)

В [17]: sys.getsizeof(t) Из[17]: 44

В [18]: aa, bb, cc, dd = sys.getsizeof(a), sys.getsizeof(b), sys.getsizeof(c), sys.getsizeof(d)

В [19]: sum([aa, bb, cc, dd]) Из [19]: 56