5 .3 . Записи, структуры
и объекты переноса данных 171
рактеристики. В конце раздела вы найдете резюме и руководство для при-
нятия решений, которое поможет вам сделать свой собственный выбор.
Ладно, давайте начнем!
dict —
простые объекты данных
Словари Python хранят произвольное количество объектов, при этом
каждый идентифицируется уникальным ключом
1
. Словари также нередко
называются
ассоциативными массивами или
таблицами соответствий
и позволяют производить эффективный поиск, вставку и удаление любого
объекта, связанного с заданным ключом.
В Python использование словарей в качестве типа данных
запись или
объекта данных вполне возможно. Словари в Python легко создаются,
поскольку они имеют свой собственный синтаксический сахар, который
встроен в язык в форме литералов словаря. Синтаксис словаря краток
и довольно удобен для набора на клавиатуре.
Объекты данных, создаваемые с использованием словарей, могут изме-
няться, и при этом практически отсутствует защита от опечаток в именах
полей, поскольку поля могут свободно добавляться и удаляться в любое
время. Оба этих свойства способны добавить поразительные ошибки,
и всегда существует компромисс между удобством и устойчивостью
к ошибкам, которого нужно достигать.
car1 = {
'цвет': 'красный',
'пробег': 3812.4,
'автомат': True,
}
car2 = {
'цвет': 'синий',
'пробег': 40231,
'автомат': False,
}
# Словари имеют хороший метод repr:
1
См. раздел «Словари, ассоциативные массивы и хеш-таблицы» настоящей главы.
172 Глава 5 • Общие
структуры данных Python
>>> car2
{'цвет': 'синий', 'автомат': False, 'пробег': 40231}
# Получить пробег:
>>> car2['пробег']
40231
# Словари изменяемы:
>>> car2['пробег'] = 12
>>> car2['лобовое стекло'] = 'треснутое'
>>> car2
{'лобовое стекло': 'треснутое', 'цвет': 'синий',
'автомат': False, 'пробег': 12}
# Отсутствует защита от неправильных имен полей
# или отсутствующих/лишних полей:
car3 = {
'цвет': 'зеленый',
'автомат': False,
'лобовое стекло': 'треснутое',
}
tuple —
неизменяемые группы объектов
Кортежи в Python представляют собой простые структуры данных, пред-
назначенные для группирования произвольных объектов
1
. Кортежи не-
изменяемы — после их создания их нельзя исправить.
С точки зрения производительности кортежи занимают чуть меньше
оперативной памяти, чем списки в Python
2
, и к тому же быстрее созда-
ются.
Как вы видите в приведенном ниже результате дизассемблирования
байткода, конструирование кортежной константы занимает всего один
код операции
LOAD_CONST
, в то время как конструирование объекта-списка
с одинаковым содержимым требует еще нескольких операций:
1
См. документацию Python «tuple»:
https://docs .python .org/3/tutorial/datastructures .
html#tuples-and-sequences
2
См. CPython: «tupleobject.c» (
https://github .com/python/cpython/blob/master/Objects/
tupleobject .c
) и «listobject.c» (
https://github .com/python/cpython/blob/master/Objects/listobject .c
)
5 .3 . Записи, структуры и объекты переноса данных
173
>>>
import dis
>>> dis.dis(compile("(23, 'a', 'b', 'c')", '', 'eval'))
0 LOAD_CONST 4 ((23, 'a', 'b', 'c'))
3 RETURN_VALUE
>>> dis.dis(compile("[23, 'a', 'b', 'c']", '', 'eval'))
0 LOAD_CONST 0 (23)
3 LOAD_CONS 1 ('a')
6 LOAD_CONS 2 ('b')
9 LOAD_CONST 3 ('c')
12 BUILD_LIS 4
15 RETURN_VALUE
Однако вам не стоит особенно налегать на эти различия. На практике
разница в производительности часто будет незначительной, и попытка
выжать из программы больше эффективности, переключаясь со списков
на кортежи,
вероятно, будет нерациональной.
Возможным недостатком простых кортежей является то, что данные,
которые вы в них храните, извлекаются только путем доступа к корте-
жу через целочисленные индексы. У вас не получится назначить имена
отдельным хранящимся в кортеже свойствам. А это может сказаться на
удобочитаемости исходного кода.
Кроме того, кортеж всегда является ситуативной структурой: трудно
гарантировать, что у двух кортежей будет одинаковое количество полей
и одинаковые хранящиеся в них свойства.
А это — раздолье для ошибок «по недоразумению», например для раз-
ночтений порядка следования полей. Поэтому я рекомендую держать
минимальное количество полей в кортеже.
Do'stlaringiz bilan baham: