Действительно ли кортежи более эффективны, чем списки в Python?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

201
задан Raymond Hettinger 22 February 2018 в 10:25
поделиться

5 ответов

dis модуль демонтирует код байта для функции и полезен для наблюдения различия между кортежами и списками.

В этом случае, Вы видите, что доступ к элементу генерирует идентичный код, но что присвоение кортежа намного быстрее, чем присвоение списка.

>>> def a():
...     x=[1,2,3,4,5]
...     y=x[2]
...
>>> def b():
...     x=(1,2,3,4,5)
...     y=x[2]
...
>>> import dis
>>> dis.dis(a)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               2 (2)
              6 LOAD_CONST               3 (3)
              9 LOAD_CONST               4 (4)
             12 LOAD_CONST               5 (5)
             15 BUILD_LIST               5
             18 STORE_FAST               0 (x)

  3          21 LOAD_FAST                0 (x)
             24 LOAD_CONST               2 (2)
             27 BINARY_SUBSCR
             28 STORE_FAST               1 (y)
             31 LOAD_CONST               0 (None)
             34 RETURN_VALUE
>>> dis.dis(b)
  2           0 LOAD_CONST               6 ((1, 2, 3, 4, 5))
              3 STORE_FAST               0 (x)

  3           6 LOAD_FAST                0 (x)
              9 LOAD_CONST               2 (2)
             12 BINARY_SUBSCR
             13 STORE_FAST               1 (y)
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE
159
ответ дан Guillaume Jacquenot 23 November 2019 в 05:02
поделиться

В целом Вы могли бы ожидать, что кортежи будут немного быстрее. Однако необходимо определенно протестировать конкретный случай (если различие могло бы повлиять на производительность программы - помнят, что "преждевременная оптимизация является корнем всего зла").

Python делает это очень легким: timeit является Вашим другом.

$ python -m timeit "x=(1,2,3,4,5,6,7,8)"
10000000 loops, best of 3: 0.0388 usec per loop

$ python -m timeit "x=[1,2,3,4,5,6,7,8]"
1000000 loops, best of 3: 0.363 usec per loop

и...

$ python -m timeit -s "x=(1,2,3,4,5,6,7,8)" "y=x[3]"
10000000 loops, best of 3: 0.0938 usec per loop

$ python -m timeit -s "x=[1,2,3,4,5,6,7,8]" "y=x[3]"
10000000 loops, best of 3: 0.0649 usec per loop

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

, Конечно, если бы Вы хотите к изменение объект, список определенно будет быстрее, так как необходимо было бы создать весь новый кортеж для изменения одного объекта его (так как кортежи неизменны).

200
ответ дан Ringil 23 November 2019 в 05:02
поделиться

Кортежи, будучи неизменными, являются большей эффективной памятью; списки, для эффективности, сверхвыделяют память для разрешения, добавляет без постоянного realloc с. Так, если Вы хотите выполнить итерации через постоянную последовательность значений в Вашем коде (например, for direction in 'up', 'right', 'down', 'left':), кортежи предпочтены, так как такие кортежи предварительно вычисляются во время компиляции.

скорости Доступа должны быть тем же (они оба хранятся как непрерывные массивы в памяти).

, Но, alist.append(item) очень предпочтен atuple+= (item,), когда Вы имеете дело с изменяемыми данными. Помните, кортежи предназначаются, чтобы рассматриваться как записи без имен полей.

31
ответ дан tzot 23 November 2019 в 05:02
поделиться

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

9
ответ дан Eponymous 23 November 2019 в 05:02
поделиться

Кортежи должны быть немного более эффективными и из-за этого, быстрее, чем списки, потому что они неизменны.

4
ответ дан ctcherry 23 November 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: