在实际开发中,我们经常会使用一个类来表示一个对象,从数据库从取出数据之后需要保存在具体的数据结构中进行处理。我们可以使用元组,字典和类进行存储。
我们将取出的数据保存在一个元组内,例如有一个数据类型(str, int, float)的表,我们读出数据之后保存在元组当中。
问题在于,元组保存只能通过下标访问原始数据,需要记住属性的位置才能访问,不是很容易理解。
我们同样读取一段csv文件,观察不同数据结构保存下所用的内存大小和峰值大小。我们使用列表保存所有不同的数据结构。
Memory Use: Current 128447442, Peak 128481645
将取出的数据保存在一个字典当中,按照每一列的属性值为键,对应的数值为值保存起来。
Memory Use: Current 220856250, Peak 220890453
可以看到字典保存的方式占的空间几乎翻倍,需要更多的空间来保持键值对映射。
因为元组通过下标访问的方式不是很容易理解,字典的空间开销太大,因此python目前有一种称为命名元组nametuple的数据结构,他是python内置库collections里的一个数据结构。
from collections import namedtuple
Row = namedtuple('Row',('route','date','daytype','rides'))
使用Row保存数据结构,再次检测保存所有的数据所需要的内存空间大小。
Memory Use: Current 133068434, Peak 133102637
内存大小仅比tuple大了3%,但是能够实现通过属性名访问的功能。
class Row:
def __init__(self, route, date, daytype, rides):
self.route = route
self.date = date
self.daytype = daytype
self.rides = rides
用类来接收数据并保存是大部分语言中使用的方法,Java里规范的方法就是为所有的数据集合建立一个类。
Memory Use: Current 179272954, Peak 179307157
但是我们发现用类保存所使用的空间反而更大了,还不如nametuple,因为类的底层使用字典来保存数据,这里我们可以使用slot方法来设置类的属性。
在Python中,slots是一个特殊的属性,用于限制类的实例可以拥有的属性。通过在类中定义__slots__,可以指定哪些属性可以存在于类的实例中,从而限制了实例可以动态添加的属性数量,提供了一些性能和内存优化的可能性。
在Python中,每个实例的属性都存储在一个字典中,这会消耗一定的内存。通过使用 __slots__,可以减少每个实例所需的内存开销,因为不再需要额外的字典来存储属性。
class Row:
__slots__ = ('route', 'date', 'daytype', 'rides')
def __init__(self, route, date, daytype, rides):
self.route = route
self.date = date
self.daytype = daytype
self.rides = rides
使用slot定义数据之后,所占的内存空间大小为:
Memory Use: Current 123827482, Peak 123861685