创建许多类实例有什么弊端吗?

时间:2019-07-17 06:52:24

标签: python performance class readability

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

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

不仅仅是创建嵌套列表?

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

除了为了易于使用而对某些实例名称进行交易以外,我是否还要担心诸如性能下降之类的问题?

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

3 个答案:

答案 0 :(得分:2)

我的建议是首先针对代码的可读性可维护性进行优化。仅在表现得很明显成为问题时才关注性能。知道这是一个问题之后,您就可以完整地测量系统,确定瓶颈并加以解决。

您可能会发现:

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

考虑到这一点,与第二种方法相比,我更倾向于第一种方法。

答案 1 :(得分: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
     ...

答案 2 :(得分: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]进行操作了,但这比较麻烦,需要更多的代码,并且此代码也更脆弱(足以修改列表的顺序一次,以破坏所有内容向上)。另一方面,您会得到一个列表,可以按定义好的顺序对进行迭代(也可以对成员/局部变量进行迭代,但是顺序可能是任意的)。

所以这些是主要区别。您选择的内容取决于您,但就个人而言,我会选择第一个版本,因为命名是对可读性的极大推动。