python中将len()和sum()存储为变量的约定

python中将len()和sum()存储为变量的约定,python,conventions,Python,Conventions,python中是否有存储len()或sum()值的时间和方式约定?举个例子,如果你有一个类 class MyClass: def __init__(self, single_number = 4, multiple_numbers = [1,2,3]): self.single= single_number self.multiple = multiple_numbers def info(self): print(f"The

python中是否有存储
len()
sum()
值的时间和方式约定?举个例子,如果你有一个类

class MyClass:

    def __init__(self, single_number = 4, multiple_numbers = [1,2,3]):
        self.single= single_number 
        self.multiple = multiple_numbers

    def info(self):
        print(f"The length of multiple is {len(self.multiple)}")
        print(f"The length of multiple is {len(self.multiple)*4}")
        print(f"The length of multiple is longer than {len(self.multiple)-1}")

if __name__ == "__main__":
    test=MyClass()
    test.info()
    # other stuff
    test.info()
在什么时候开始将
len(self.multiple)
存储为其自身的值?谢天谢地,python在一些任务中不用使用
len
,比如
在多个数字中使用我的数字:
,这样我就不需要只在迭代中使用它了。此外,
len
的值对于类的实例是静态的,并且在运行时的不同部分需要(可能)多次,因此它不是临时变量。一般来说,这似乎是(非常少量的)内存与计算之间的折衷。同样的问题也适用于
sum()

这些问题的一部分是基于意见的,我很高兴听到你们对它的看法,但我主要是希望就此达成一项公约

  • 如果有的话,
    len(self.multiple)
    应该在什么时候存储为它自己的值
  • 这个名字有约定吗<“代码>多个数字的长度”看起来有些臃肿,但可能是描述性的

  • 我会使用局部变量,更多的是为了代码可读性而不是速度:

    def info(self):
        n = len(self.multiple)
        print(f"The length of multiple is {n}")
        print(f"The length of multiple is {n*4}")
        print(f"The length of multiple is longer than {n-1}")
    
    局部变量名称可以很短,因为赋值与使用在同一屏幕上。我使用自己的约定,但它们通常遵循常见的非正式约定

    我不会尝试将
    len(…)
    分配给
    self
    属性,更不用说全局属性了


    基本上,在函数/方法中重复使用的任何值都是局部变量赋值的候选值。

    我不认为有太多值得存储的地方,除非每次的计算成本都很高。参见hpaulj的答案

    然而,如果你真的想,你可以使用一个属性,甚至可能缓存它

    class MyList(list):
    
       @property
       def len_(self):
          return len(self)  #it's a list
    or
    
       _len_ = None
    
       @property 
       def len_(self):
          if self._len_ is None:
              self._len_ = len(self)
          return self._len_
    
        def append(self, value):
           self._len_ = None
           super(MyList, self).append(value)
    
        ...and all other len-modifying methods also need to clear the cache.
    
    
    同样,如果缓存它,则需要确保每次更改结果时都重置缓存。这也是您存储在实例变量上的想法的弱点——确保没有过时数据的额外复杂性可能只有在您确定这确实是一个性能瓶颈后才能接受

    (顺便说一句,在您的示例中,使用for
    多个\u编号对这些问题没有帮助)。一般来说,如果sum/len取决于可变项的状态,那么存储/缓存计算是一个更糟糕的想法。i、 e.如果MyList引用的对象本身具有需要聚合的len/sum,那么MyList就没有任何缓存/存储的业务


    在命名方面,我可能会选择a的名称,即添加一个
    cls
    ->
    cls
    list
    ->
    list

    您的
    多个
    更改大小的频率是多少?每次都必须更新
    self.len\u multiple
    。如果该值是静态的,否则您必须经常对其调用
    len
    ,请存储该值。如果值不是静态的,您可以考虑存储值,但在任何更新时将其更新到基础值,但这取决于您认为在更新之间调用“代码> LeN/CODE”有多频繁。只有当将其存储为变量时,代码才更容易阅读,B)您需要这样做,因为程序的逻辑依赖于它,或者c)对它进行基准测试并确定它是一个瓶颈。
    len()
    在大多数容器类型上是一个O(1)操作-存储它没有任何好处
    sum()
    是O(n),所以如果您可能不止一次需要它,最好将其存储。@Guimoute在这种情况下,局部变量比将其存储在类中更有用(因为每个人都认为OP是“存储为其自身值”的意思)。您的语法很奇怪。装饰师有额外的文字,或者在班级中的身体,…好抓到。我“徒手”编辑了它,而不是编辑一个.py文件并粘贴到代码中。你知道,真正奇怪的是我不得不在更改之前删除它好几次。