2017-02-08 15 views
2

я заметил следующий факт в Python:питона список SizeOf против SIZEOF кортежа

>>> (1, 2, 3).__sizeof__() 
48 

>>> [1, 2, 3].__sizeof__() 
64 

Я понимаю разницу между списком и кортежей, но я ожидал их SizeOf (size of object in memory) быть одинаковыми: оба приходят с методами и оба содержат одинаковые значения.

Кроме того, размер разница зависит от элементов Длинна: ​​

>>> for size in (10, 100, 1000, 10000): 
     tuple_ = tuple(range(size)) 
     list_ = list(range(size)) 
     print list_.__sizeof__(), tuple_.__sizeof__()  
176 104 
984 824 
9088 8024 
90088 80024 
  • Как мы можем это объяснить?
  • Где я могу найти хороший документ для внутренних компонентов python?

ответ

3

list объекты предназначены для динамично расти (через append, extend или список понимание здания). Было бы невозможно выполнить команду realloc (и, возможно, memmove) при каждом добавлении элемента. Таким образом, существует алгоритм «роста», который пытается предсказать, сколько элементов потребуется (это просто статистическая догадка, конечно).

Именно поэтому фактически выделенная память может быть больше, чем количество элементов.

tuple объекты неизменяемы. Нет причин, по которым Python будет выделять больше элементов.

Некоторые ссылки о алгоритме роста списка:

2

Согласно Raymond Хеттингер и tzot от Are tuples more efficient than lists in Python?,

В принципе, кортежи можно получить быстрее, чем списки поскольку он хранится более эффективно, поскольку кортежи неизменяемы.

Список, в отличие от кортежей, создается с нуля.

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

+1

Мне понравился ваш комментарий, пока я не увидел 'compile time'. Я что-то пропустил? –

+1

@OrDuan, время, когда источник python скомпилирован в байт-код (какой байт-код может быть сохранен как файл .py [co]). –

+0

Файлы @omri_saadon pyo/pyc быстрее при запуске скрипта, если вы используете переменные внутри своих функций/'__main__', не должно быть повышения производительности, правильно? Просто хочу убедиться, что я все здесь. –

0

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