在用Python编写的基于代理的模型中使用__slots__

dav*_*ugh 3 python agent agent-based-modeling

我有兴趣在Python 中构建基于代理的经济系统模型.典型的模型可能有数千个代理商(即公司,消费者等).

典型的公司代理类可能类似于:

class Firm(object):

    def __init__(capital, labor, productivity):
        self.capital = capital
        self.labor = labor
        self.productivity = productivity
Run Code Online (Sandbox Code Playgroud)

在我的大多数模型中,属性不是动态创建的,因此我可以使用__slots__以下方法编写类:

class Firm(object):
    __slots__ = ('capital', 'labor', 'productivity')

    def __init__(capital, labor, productivity):
        self.capital = capital
        self.labor = labor
        self.productivity = productivity
Run Code Online (Sandbox Code Playgroud)

然而,它似乎是使用__slots__一般不提倡.我想知道这是否是合法/可取的用例__slots__.

Mar*_*ers 6

__slots__功能专门用于在创建大量实例时节省内存.引用__slots__文件:

默认情况下,旧式和新式类的实例都有一个属性存储字典.这会浪费具有很少实例变量的对象的空间.在创建大量实例时,空间消耗会变得很严重.

可以通过__slots__在新样式类定义中定义来覆盖默认值.该__slots__声明需要实例变量和储备只够空间的序列中的每个实例来保存每个变量的值.保存空间是因为__dict__没有为每个实例创建空间.

听起来你正在使用插槽是出于正确的原因.

不鼓励使用__slots__的是无动态属性的副作用; 你应该使用元类代替.