python dict.update与下标一起添加单个键/值对

Dav*_* B. 28 python

每学期我至少有一个Python学生使用dict.update()来添加单个键/值对,即:

mydict.update({'newkey':'newvalue'})
Run Code Online (Sandbox Code Playgroud)

代替

mydict['newkey'] = 'newvalue'
Run Code Online (Sandbox Code Playgroud)

我不教这种方法,我不知道他们在哪里找到这个例子,但是我告诉他们不要这样做,因为效率较低(可能会创建一个新的2元素字典)并且因为它是非标准的.

老实说,我可以理解使用可见方法而不是这种语法的愿望 - 它可能与其他方法调用更加一致.但我觉得它看起来像一个新手的方法.

在这一点上,任何人都有任何智慧吗?

ick*_*fay 25

基准测试显示您对其性能影响的怀疑似乎是正确的:

$ 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
Run Code Online (Sandbox Code Playgroud)

也就是说,它在我的机器上慢了大约六倍.但是,如果您需要最佳性能,Python已经不是您使用的语言了,因此我建议您使用在这种情况下最易读的内容.对于很多事情,这将是[]方式,但update在这种情况下可能更具可读性:

configuration.update(
    timeout=60,
    host='example.com',
)
Run Code Online (Sandbox Code Playgroud)

…或类似的东西.

  • 执行索引更新所花费的时间在任何有意义的应用程序中都是无关紧要的。[]= 的可读性要重要得多。我发现更新版本不太明显。 (3认同)
  • @PeterWooster:我同意可读性更重要,但我个人认为 `update` 更具可读性。 (3认同)
  • @PeterWooster:这不是我更喜欢“更新”的原因。我更喜欢 `update`,因为它不会在每一行重复 `configuration`,而且引号更少。 (2认同)
  • 我觉得在像OP这样的情况下,你只想更新单个键/值对,使用“[]”最有意义,而当你想更新“dict”时,使用“update”更自然来自另一个已经在其他地方定义的“dict”的项目。 (2认同)

Pet*_*ter 8

有些人认为 []= 不是面向对象语言或任何其他语言中的有效语法元素。我记得几十年前当我从事 APL 语言开发时就听到过这个论点。该语法是 Fortran 的保留...

我个人并不赞同这种观点,并且对索引作业非常满意。但有些人会声称真正的方法调用更好。当然,拥有多个解决方案总是好的。

编辑:这里真正的问题是可读性,而不是性能,索引作业一直存在,因为许多人发现作业更容易阅读,即使理论上不太正确。


kay*_*kay 7

直接更新密钥的速度是原来的三倍,但 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
Run Code Online (Sandbox Code Playgroud)