创建大量 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]
,但这更麻烦,需要更多代码而且这段代码更脆弱(修改列表的顺序一次就足以破坏一切向上)。另一方面,您会得到一个列表,您可以按明确定义的顺序迭代(您也可以迭代成员/局部变量,但顺序可能是任意的)。
所以这些是主要区别。你选择什么取决于你,但就我个人而言,我会选择第一个版本,因为命名对可读性有很大的促进作用。
我在游戏中有很多变量需要跟踪,我想知道创建大量 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]
,但这更麻烦,需要更多代码而且这段代码更脆弱(修改列表的顺序一次就足以破坏一切向上)。另一方面,您会得到一个列表,您可以按明确定义的顺序迭代(您也可以迭代成员/局部变量,但顺序可能是任意的)。
所以这些是主要区别。你选择什么取决于你,但就我个人而言,我会选择第一个版本,因为命名对可读性有很大的促进作用。