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

3

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

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

不要只创建一个嵌套列表?

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

除了为了在类的情况下方便使用而交换一些实例名称之外,我应该担心性能惩罚或类似的问题吗?
编辑:我提到了易用性,我想知道的是:列表中的类是否比嵌套列表使用更多的资源,还是反过来?

2
这是一个性能问题吗?在它成为问题之前不要担心。我建议使用“混合解决方案”并在列表中使用许多对象。 - deceze
我建议采用第一种方法,因为检索会更容易。 - Jainil Patel
3个回答

2
我的建议是,首先优化你的代码的可读性和可维护性。只有当性能明显存在问题时才关注它。一旦确定存在问题,你就能够全面地测量系统,确定瓶颈并解决它们。
可能会发现:
1. 性能根本不是问题; 或者
2. 性能确实存在问题,但瓶颈并不在你原来认为的地方(从经验上看,这种情况经常发生)。
考虑到这一点,我更倾向于第一种方法。

1
如果你的类没有很多方法,只定义了一些实例变量,我更喜欢使用嵌套列表,一个例子类如下:
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
     ...

1
这取决于你认为什么是缺点。从性能角度来看,你应该先写易读的代码,然后进行测量和优化。但这已经写好了,所以让我们探讨这两种风格之间的第二个主要区别。
如果你写:
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],但这更加繁琐,需要更多的代码,而且这段代码更加脆弱(只需一次修改列表顺序即可使所有内容崩溃)。另一方面,你得到了一个列表,可以按照明确定义的顺序进行迭代(也可以迭代成员/本地变量,但顺序可能会发生任意变化)。
所以这些是主要的区别。你选择哪个取决于你,但个人而言,我会选择第一个版本,因为命名对可读性有很大提升。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接