Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
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
В целом Вы могли бы ожидать, что кортежи будут немного быстрее. Однако необходимо определенно протестировать конкретный случай (если различие могло бы повлиять на производительность программы - помнят, что "преждевременная оптимизация является корнем всего зла").
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
Так в этом случае, инстанцирование является почти порядком величины быстрее для кортежа, но доступ объекта на самом деле несколько быстрее для списка! Таким образом, если Вы создаете несколько кортежей и получаете доступ к ним многие много раз, это может на самом деле быть быстрее для использования списков вместо этого.
, Конечно, если бы Вы хотите к изменение объект, список определенно будет быстрее, так как необходимо было бы создать весь новый кортеж для изменения одного объекта его (так как кортежи неизменны).
Кортежи, будучи неизменными, являются большей эффективной памятью; списки, для эффективности, сверхвыделяют память для разрешения, добавляет без постоянного realloc
с. Так, если Вы хотите выполнить итерации через постоянную последовательность значений в Вашем коде (например, for direction in 'up', 'right', 'down', 'left':
), кортежи предпочтены, так как такие кортежи предварительно вычисляются во время компиляции.
скорости Доступа должны быть тем же (они оба хранятся как непрерывные массивы в памяти).
, Но, alist.append(item)
очень предпочтен atuple+= (item,)
, когда Вы имеете дело с изменяемыми данными. Помните, кортежи предназначаются, чтобы рассматриваться как записи без имен полей.
Необходимо также рассмотреть array
модуль в стандартной библиотеке, если все объекты в списке или кортеже имеют тот же тип C. Это возьмет меньше памяти и может быть быстрее.
Кортежи должны быть немного более эффективными и из-за этого, быстрее, чем списки, потому что они неизменны.