【问题标题】:is there any downside to creating lots of class instances?创建大量类实例有什么缺点吗?
【发布时间】:2019-07-17 06:52:24
【问题描述】:

我的游戏中有很多变量要跟踪,我想知道创建大量类实例是否有任何不利之处:

event_1 = event(name, chance, [people])
event_2 = event(name, chance, [people])
...
events = [event_1, event_2]

而不仅仅是创建一个嵌套列表?

events = [
    [name, chance, [people]],
    [name, chance, [people]],
    ...
    ]

除了在类的情况下为了便于使用而交易一些实例名称之外,我是否应该担心诸如性能损失之类的事情?

编辑:我提到了易用性,我想知道的是:列表中的类比嵌套列表使用更多的资源还是相反?

【问题讨论】:

  • 性能问题吗?在它出现之前不要担心它。而且……我会采用“混合解决方案”并使用列表中的许多对象……
  • 我会建议第一种方法,因为检索会很容易

标签: python performance class readability


【解决方案1】:

我的建议是首先优化代码的可读性可维护性。仅当明显成为问题时才关注性能。一旦您知道这是一个问题,您就能够测量整个系统,识别瓶颈并修复它们。

你可能会发现:

  • 性能根本不是问题;或
  • 这是一个问题,但瓶颈根本不在您认为的位置(根据经验,这种情况一直都在发生)。

考虑到这一点,我更喜欢第一种方法而不是第二种方法。

【讨论】:

    【解决方案2】:

    如果你的类没有做很多方法,只定义了几个实例变量,我宁愿只使用嵌套列表,我的意思是一个示例类:

    class A:
        def __init__(self, a, b, c):
            self.a = a
            self.b = b
            self.c = c
    

    如果你的类确实做了很多方法,我认为使用类可能是个好主意,我的意思是一个示例类:

    class A:
        def __init__(self, a, b, c):
            self.a = a
            self.b = b
            self.c = c
         def f1(self):
             return [x / y for x, y in zip(self.a + self.b, self.c)]
         def f2(self):
             return [[*self.a, *self.b, *self.c, i + 1] for i in range(3)]
         def f3(self):
             for x, y in enumerate(self.a):
                 if y > 3:
                     self.b[x] = y / 3
             return self.b
         ...
    

    【讨论】:

      【解决方案3】:

      这取决于对您而言究竟是什么构成了不利因素。从性能的角度来看,您应该首先编写可读性,然后测量,然后优化。但这已经写好了,所以让我们来探讨一下这两种风格的第二个主要区别。

      如果你写:

      a = event(name, chance, [people])
      b = event(name, chance, [people])
      c = event(name, chance, [people])
      

      然后你创建命名实例。您可以按名称访问它们,这意味着它们更易于使用,并且在使用时访问它们不依赖于顺序。此外,a 的访问速度比list[a_index] 稍快,尽管这并不容易衡量。

      二手书写:

      list = [
          event(name, chance, [people]) # a
          event(name, chance, [people]) # b
          event(name, chance, [people]) # c
      ]
      

      产品列表。现在当然你可以为列表创建命名索引,然后像这样list[index_for_a],但这更麻烦,需要更多的代码,而且这段代码更脆弱(修改列表的顺序一次就足以炸毁一切) .另一方面,您会得到一个列表,您可以以明确定义的顺序对其进行迭代(您也可以迭代成员/局部变量,但顺序可能是任意的)。

      所以这些是主要区别。你选择什么取决于你,但我个人会选择第一个版本,因为命名是可读性的重大提升。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-09
        • 2015-04-19
        • 1970-01-01
        • 2013-01-20
        • 2013-02-19
        • 1970-01-01
        • 2011-01-21
        • 2011-04-26
        相关资源
        最近更新 更多