Python dict.update против индекса, чтобы добавить одну пару ключ/значение
В каждом семестре у меня есть хотя бы один ученик Python, который использует dict.update(), чтобы добавить одну пару ключ/значение, а именно:
mydict.update({'newkey':'newvalue'})
вместо
mydict['newkey'] = 'newvalue'
Я не преподаю этот метод, и я не знаю, где они находят примеры этого, но я говорю им не делать этого, потому что он менее эффективен (предположительно создает новый 2-элементный dict) и потому что он нестандартный.
Честно говоря, я могу понять желание использовать видимый метод, а не этот синтаксис - он, возможно, чувствует себя более совместимым с другими вызовами методов. Но я думаю, что это похоже на подход новичков.
Есть ли какая-нибудь мудрость, которую кто-то может предложить по этому поводу?
Ответы
Ответ 1
Тест показывает, что ваши подозрения на его влияние на производительность кажутся правильными:
$ python -m timeit -s 'd = {"key": "value"}' 'd["key"] = "value"'
10000000 loops, best of 3: 0.0741 usec per loop
$ python -m timeit -s 'd = {"key": "value"}' 'd.update(key="value")'
1000000 loops, best of 3: 0.294 usec per loop
$ python -m timeit -s 'd = {"key": "value"}' 'd.update({"key": "value"})'
1000000 loops, best of 3: 0.461 usec per loop
То есть, он примерно в шесть раз медленнее на моей машине. Тем не менее, Python уже не является языком, который вы бы использовали, если вам нужна максимальная производительность, поэтому я бы рекомендовал использовать то, что наиболее читаемо в этой ситуации. Для многих вещей это будет []
способ, хотя update
может быть более читаемым в такой ситуации:
configuration.update(
timeout=60,
host='example.com',
)
& hellip; или что-то в этом роде.
Ответ 2
Обновление ключа напрямую происходит в три раза быстрее, но YMMV:
$ python -m timeit 'd={"k":1}; d.update({"k":2})'
1000000 loops, best of 3: 0.669 usec per loop
$ python -m timeit 'd={"k":1}; d["k"] = 2'
1000000 loops, best of 3: 0.212 usec per loop
Ответ 3
Есть люди, которые считают, что [] = не является допустимым синтаксическим элементом на объектно-ориентированном языке или каким-либо другим аспектом. Я помню, как я слышал этот аргумент несколько десятилетий назад, когда я работал над развитием языка APL. Этот синтаксис представляет собой задержку фортрана...
Я лично не подписываюсь на эту точку зрения и вполне доволен индексированным присваиванием. Но есть те, которые утверждают, что лучший вызов метода лучше. И, конечно, всегда полезно иметь более одного решения.
Изменить:
Реальная проблема здесь - читаемость, а не производительность, индексированное назначение выдержало, потому что многие люди считают, что назначение легче читать, даже если оно менее теоретически правильно.