В питоне предусмотрена возможность создать словарь двумя способами - через фигурные скобки {} и через конструктор dict(). В чем разница и что лучше использовать в коде?
Код
a = dict(one=1, two=2, three=3)b = {'one': 1, 'two': 2, 'three': 3}
Пример наглядно демонстрирует что при статическом определении атрибутов количество кода практически одинаковое (скобки больше всего лишь на 2 символа).
Инициализация
Конструктор словаря предлагает расширенный функционал для инициализации словаря.d = dict((str(v),v) for v in range(10))
dict(zip(['one', 'two', 'three'], [1, 2, 3]))
Скорость работы
Выполним в консоли следующие выражения>>python -m timeit "{}"
10000000 loops, best of 3: 0.034 usec per loop
>>python -m timeit "dict()"
10000000 loops, best of 3: 0.127 usec per loop
Почему такая существенная разница в скорости? Все просто, смотрим что выдает диассемблер
>>import dis
>>def d(): t = {}
>>dis.dis(d)
1 0 BUILD_MAP 0
3 STORE_FAST 0 (t)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
>>def d(): t = dict()
>>dis.dis(d)
1 0 LOAD_GLOBAL 0 (dict)
3 CALL_FUNCTION 0
6 STORE_FAST 0 (t)
9 LOAD_CONST 0 (None)
12 RETURN_VALUE
При вызове конструктора dict() выполняется большее количество инструкций питона.
Вывод
Если для словаря заранее известны пары ключ-словарь, то в коде лучше использовать фигурные скобки, т.к. они дают некоторый прирост скорости при создании словаря. При динамическом создании словаря придется использовать конструктор.PS. Все выводы актуальны и для списков
Ссылки
https://docs.python.org/2/library/stdtypes.html#mapping-types-dicthttp://stackoverflow.com/questions/6610606/dict-literal-vs-dict-constructor-any-preferred
Комментариев нет:
Отправить комментарий