【问题标题】:python dict.update vs. subscript to add a single key/value pair [closed]python dict.update与下标添加单个键/值对[关闭]
【发布时间】:2013-03-17 00:00:33
【问题描述】:

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

mydict.update({'newkey':'newvalue'})

而不是

mydict['newkey'] = 'newvalue'

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

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

在这一点上有人可以提供任何智慧吗?

【问题讨论】:

  • 您的问题是什么?您只是在问以这种方式使用update 是好还是坏?
  • 是的 - 以及原因。这不是一个教学问题。这是一个问题,这种方法是否效率低下,不可取等。教学部分只是一些背景。感谢 cmets
  • 那会有什么不同呢?
  • @CristianCiupitu:不。Stack Overflow 是针对特定编程问题的,这是([]update)。 Programmers.SE 在其常见问题解答中明确声明它“实施问题或编程工具”无关。
  • 有趣的是 7 年后关闭的原因似乎是虚假的,而且问题都是关于编程的。

标签: python dictionary


【解决方案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',
)

……或类似的东西。

【讨论】:

  • 执行索引更新所花费的时间在任何有意义的应用程序中都无关紧要。 []= 的可读性更为重要。我发现更新版本不太明显。
  • @PeterWooster:我同意可读性更重要,但我个人认为update 更具可读性。
  • 但你可能从未写过 Fortran :)
  • @PeterWooster:这不是我更喜欢update 的原因。我更喜欢update,因为它不会在每一行重复configuration,而且引号更少。
  • 我觉得在诸如 OP 之类的情况下,您只想更新单个键/值对,使用 [] 最有意义,而 update 在您使用时更自然想用已经在别处定义的另一个dict 中的项目更新您的dict
【解决方案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

【讨论】:

  • 很好,谢谢!我需要开始使用timeit
【解决方案3】:

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

我个人不订阅该视图,并且对索引分配非常满意。但是有些人会声称真正的方法调用更好。当然,拥有多个解决方案总是好的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2013-05-29
    • 2014-01-02
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多