Python Slots Property

Python老鸟都应该看过那篇非常有吸引力的 Saving 9 GB of RAM with Python’s __slots__ 文章,作者使用了__slots__让内存占用从25.5GB降到了16.2GB。在当时来说,这相当于用一个非常简单的方式就降低了30%的内存使用,着实惊人。作者并没有提到他的业务特点和代码,那我们就基于《fluent python》中的例子来验证下是不是有这么厉害:Machine
  1. 使用slots 但是,如果我们想要限制class的属性怎么办?比如,只允许对Student实例添加name和age属性。 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class能添加的属性: class Student(object).
  2. Slots provide a special mechanism to reduce the size of objects. It is especially useful if you need to allocate thousands of objects that would otherwise take lots of memory space. It is not very common but you may find it useful someday.
  3. Using slots (only restricts setting arbitary attributes) Property Descriptor. Python ships with built in function called property. We can use this function to customize the way attributes be accessed and assigned. First I will explain you about property before I get you idea about how it is useful to make attribute readonly.

我们分别跑一下这2个类:

2种方法初始内存略有差别,但是由于这个差别和总内存量相比太小而忽略不计,结论就是:

Python Slots Property Online

使用slots可以让内存使用减少3.5倍!!# 通过 (200 - 4) / ((60 - 4) * 1.0) 计算得来

The datatype may be any Python type name or a string identifying a C datatype. Since this tutorial presupposes no C knowledge, we'll stick to Python types. A PySide/PyQt Signal-Sending Circle. Let's define a Circle with properties x, y, and r, denoting the x and y position of the. In Python, property is a built-in function that creates and returns a property object. The syntax of this function is: property (fget=None, fset=None, fdel=None, doc=None).

那么用slot就是非非常那个有必要吗?事实上500000个实例这种机会非常少见,用不用完全根据业务来决定,并不要以偏概全。因为(敲黑板了哈)使用__slots__也是有副作用的:

第三点有点难理解,我写个例子看看吧:

所以实例不超过万级别的类,__slots__是不太值得使用的。

Python Slots Property Management

PS:《fluent python》比我狠,说的是小于百万级别实例不值得使用。

无耻的广告:《Python Web开发实战》上市了!

Python Slots Property For Sale

欢迎关注本人的微信公众号获取更多Python相关的内容(也可以直接搜索「Python之美」):