我已经开始迈出学习python的第一步,并尝试开始使用类。在
到目前为止,我有一个简化版本:
class ThingsInTheFridge(object):
def __init__(self):
self.milk = False
self.yogurt = False
self.bread = True
self.umbrella = True
在我的课堂上会有大约30件事,每件事都有正确或错误的分配(我已经缩短了这个问题的列表)。在
最有效的分配方法是什么?在
我考虑过这一点,但似乎并没有改善任何事情,尤其是当列表的大小增加时:
^{pr2}$编辑: 我也许应该提到班上还有其他项目(我省略了它们,因为我认为这无关紧要):
class ThingsInTheFridge(object):
def __init__(self):
self.milk = False
self.yogurt = False
self.bread = True
self.umbrella = True
self.bulb = "maker name"
self.shoes = 2
如果你真的关心运行时的效率,你几乎肯定找错地方了。如果初始化成员花费的时间太长(这不太可能…但是如果您分析并发现这是热点…),正确的答案是使用^{} ,而不是更改初始化的方式。在
如果您关心程序员效率(可读性,以及较小程度上的可写性),您可以始终这样做:
如果您想更动态地执行操作,可以使用^{} 执行类似的操作,但我不建议这样做:
^{pr2}$我不推荐它的原因是,如果您需要在这个级别上动态地做事情,那么您可能还需要在access级别保持动态,这意味着您确实应该使用},正如Lattyware所解释的那样。在
dict
或{您也可以在类样式系统的基础上为自己构建一个原型样式的OO系统,或者创建一个基于类信息初始化实例的元类,等等,但是,正如这句话的开头所指出的那样,这将是过分的。在
我认为这显示了你存储数据的模型有问题。您可能希望使用像集合这样的数据结构,而不仅仅是属性。在
例如:
然后只需将所需的存储在
stored
集中。集合对于成员身份检查有非常快的性能,因此要进行检查,可以简单地执行"milk" in stored
。在如果您真的想保留现有的接口,可以使用
^{pr2}$__getattr__()
来覆盖请求属性时的操作:这将使
False
返回到冰箱中没有的任何东西,如果您需要它只对可能的项目做出响应,这很容易做到:当然,也可以设置:
另一种选择是对
True
/False
的一种说法——我不能说我认为两者都是特别好的,一种可能更适合你的项目。只要用最适合你的。在我认为您的主要关注点应该是可读性和底层数据结构。在
类似这样的东西非常易读,而且(很可能)您可以通过自己的滚动实现高性能:
现在试试看:
^{pr2}$这是基于collection module Counter class.你不太可能想出更快的原生Python。在
相关问题 更多 >
编程相关推荐