创建大量 class 个实例有什么缺点吗?

is there any downside to creating lots of class instances?

我在游戏中有很多变量需要跟踪,我想知道创建大量 class 个实例是否有任何缺点:

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

而不只是创建嵌套列表?

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

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

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

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

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

如果你的 class 确实做了很多方法,我认为使用 classes 是个好主意,举个例子 class 我的意思是:

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
     ...

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

您可能会发现:

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

考虑到这一点,我更倾向于第一种方法而不是第二种方法。

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

如果你写:

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],但这更麻烦,需要更多代码而且这段代码更脆弱(修改列表的顺序一次就足以破坏一切向上)。另一方面,您会得到一个列表,您可以按明确定义的顺序迭代(您也可以迭代成员/局部变量,但顺序可能是任意的)。

所以这些是主要区别。你选择什么取决于你,但就我个人而言,我会选择第一个版本,因为命名对可读性有很大的促进作用。