Python中更节省内存的结构表示?

时间:2017-12-17 09:55:32

标签: python c struct cython ctypes

我有相当于我正在尝试创建的经典Point结构。

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])

但是,我只需要有限的功能(按属性名称访问)而不需要增加namedtuples的额外开销(例如长度,索引访问,__contains__等)。此外,我的用例也有固定类型对于Point.xPoint.y所以可能还有一个依赖于静态类型保证的黑客攻击。

是否存在内存开销更少的内容?也许是ctypesCython解决方案?

2 个答案:

答案 0 :(得分:2)

我想,创建一个Cython扩展将是减少内存影响的最简单方法。 Cython扩展类型的属性直接存储在对象的C结构中,并且属性集在编译时是固定的(很像Python的__slots__)。

cdef class Point:

    cdef readonly double x, y  # C-level attributes

    def __init__(self, double x, double y):
        self.x = x
        self.y = y

    def __repr__(self):
        return 'Point({}, {})'.format(self.x, self.y)

答案 1 :(得分:0)

对于无法使用Cython的情况

有一种减少内存占用的方法:

>>> from recordclass import structclass
>>> Point = structclass("Point", "x y", gc=False)
>>> p = Point(1,2)
>>> class Point2(object):
.... __slots__ = ('x', 'y')
.... def __init__(self, x, y):
....    self.x = x
....    self.y = y
>>>
>>> p2 = Point2(1,2)
>>> from sys import getsizeof as sizeof
>>> sizeof(p2) - sizeof(p)
24

差异等于用于循环垃圾收集支持的额外空间的大小。

附言:我是记录类库的作者。