【问题标题】:Is it more efficient to assign objects attributes which are also objects to a variable or call them everytime [closed]将也是对象的对象属性分配给变量或每次调用它们是否更有效[关闭]
【发布时间】:2019-07-26 13:58:02
【问题描述】:

我有 2 节课:

class Status:
    id = 1
    text = "blah"

class User:
    status = StatusObject

在我的程序中,我需要获取状态的 ID 和文本。

这两种解决方案中哪一种更有效/更容易被接受?

解决方案 1:

status = User.status
id = status.id
text = status.text

解决方案 2:

id = user.status.id
text = user.status.text

谢谢!

【问题讨论】:

标签: python


【解决方案1】:

当访问一个变量或一个对象的成员时,python 会执行字典查找(在locals()globals()class.__dict__ ......你可以命名它)

所以有了这个:

id = user.status.id

首先,您正在跟踪 id(它获取对象的 ID),但您正在进行 3 次字典查找(userstatusid

user.status 别名化为status 使代码稍微快一些(非常略快,只有 2 次 dict 查找)

此技术用于著名问题How do you remove duplicates from a list whilst preserving order?answer

def f7(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq if not (x in seen or seen_add(x))]

seen_addseen.add 的别名。保存一次查找。

在你的情况下,它也更容易阅读(因为相同的模式不会重复多次(而且更“面向对象”,因为你更清楚地定义了上下文)。

这在所有语言中都是如此(即使编译语言能够识别重复访问并在二进制文件中为它们起别名,python 无法做到)

【讨论】:

  • 所以对于id = user.status.id,python首先在用户字典中查找状态属性,然后在状态属性字典中查找id。因此,将user.status 别名为状态会减少查找次数,从而使其速度非常小。我理解正确吗?
  • 是的。每个标记都意味着一个查找。
  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2017-12-19
相关资源
最近更新 更多