Python进阶系列(三)— 数据结构与存储优化

数据结构

在实际开发中,我们经常会使用一个类来表示一个对象,从数据库从取出数据之后需要保存在具体的数据结构中进行处理。我们可以使用元组,字典和类进行存储。

元组tuple

我们将取出的数据保存在一个元组内,例如有一个数据类型(str, int, float)的表,我们读出数据之后保存在元组当中。
问题在于,元组保存只能通过下标访问原始数据,需要记住属性的位置才能访问,不是很容易理解。
我们同样读取一段csv文件,观察不同数据结构保存下所用的内存大小和峰值大小。我们使用列表保存所有不同的数据结构。

Memory Use: Current 128447442, Peak 128481645

字典dict

将取出的数据保存在一个字典当中,按照每一列的属性值为键,对应的数值为值保存起来。

Memory Use: Current 220856250, Peak 220890453

可以看到字典保存的方式占的空间几乎翻倍,需要更多的空间来保持键值对映射。

命名元组namedtuple

因为元组通过下标访问的方式不是很容易理解,字典的空间开销太大,因此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

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方法来设置类的属性。

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

你可能感兴趣的:(python,python,数据结构,开发语言)