【问题标题】:Efficient way of programming in Python高效的 Python 编程方式
【发布时间】:2013-09-03 13:24:05
【问题描述】:

这似乎是一个离题的问题,但我想知道编程的正确方法(或者说是有效的方法)。

假设我们有一个 Web 应用程序,并且在一个函数内部,我们必须检查字典键是否具有特定值(或者它可以应用于任何对象属性检查)。这些方式中哪一种更有效(在内存或速度方面),为什么?或者,如果这样做是错误的,为什么?

if myDictionary.get("xy") == "defined value":
    runSomeFunction(myDictionary.get("xy"))

myVar = myDictonary.get("xy", "")
if myVar == "defined value":
    runSomeFunction(myVar)

我们处理此代码的方式可能会有更多样化的讨论 - 在 Web 应用程序中(每分钟有数百个请求)或在普通脚本中作为最佳编程方式。

提前感谢您的任何意见。

【问题讨论】:

  • 取决于 .get("xy") 的成本以及您要优化的内容:cpu、内存 i/o...
  • 在内存方面几乎是一样的——在这两种情况下,被引用的对象在内存中只存在一次。唯一的区别是临时变量使用的内存,这无关紧要。
  • @ThiefMaster 谢谢,我想知道是否有一些内存“开销”,如果我可以这样调用它来创建临时变量而不是函数调用。
  • 变量当然需要一些内存,但它只是它“包含”的对象的“标签”。所以实际的对象不会被复制。

标签: python performance coding-style


【解决方案1】:

如果这种微优化是相关的,那么使用脚本语言是错误的技术选择。因此,除了常见的“基准它”之外,唯一正确的答案是:这并不重要。保持代码可读性。

更多技术解释:dict 是使用哈希映射实现的,即它具有 O(1) 查找。所以访问一个元素非常快。我的猜测是临时变量会快一点,因为它不涉及计算密钥的哈希值两次。

具有 100 万次迭代的 timeit 基准测试显示以下时间:

  • 0.3209540843963623(无临时变量)
  • 0.3401560783386230(温度变量)

所以使用临时变量实际上会慢一点。但请注意,这是针对 1M 次迭代的。所以每次的实际平均差异只有 0.00000002 秒。这没什么,只是证明了我的初衷:不要对不需要优化的东西进行微优化。让您的代码保持可读性。

【讨论】:

  • 好吧,如果它是 O(1),那么它实际上并不重要 :) 如果我们有一个对象 getter 并且将获取对象的任何属性怎么办(让我们把它剪成简单的类型,比如整数,字符串,...)
  • @ThiefMaster 虽然字典查找确实非常快,但get()(在 OP 的代码中使用)是一个函数调用,它们通常快速蟒蛇。
【解决方案2】:

我不确定你为什么使用字典的get() 方法。在您不知道密钥是否存在的情况下应该使用此方法——您没有提到是这种情况。所以我想知道你为什么不这样做:

if myDictionary["xy"] == "defined value":
    ...

样式说明:通常 CamelCasing 仅用于类名;更多 Pythonic 名称将是 my_dictionaryrun_some_function

字典查找速度很快。通过对您的应用程序进行基准测试,确保这确实是一个瓶颈——在不了解您的代码的情况下,我几乎可以肯定它不是。 Python 内部几乎所有内容都使用字典,这种特定的字典访问不太可能导致性能问题。

【讨论】:

  • 仅仅因为它被称为字典并不意味着它是字典。嘎嘎 :)
猜你喜欢
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
相关资源
最近更新 更多