繁体   English   中英

如何减小我的自定义 python 类型的大小?

[英]How to reduce size of my custom python type?

我创建了自己的自定义 Python 类型。 它存储一个内部字节数组。 即使数组中没有字节,object 也会占用 32 个字节。 我怎样才能减少呢?

这是我定义我的类型的方式:

typedef struct {
    PyObject_VAR_HEAD
    uint8_t *data;
} BitStream;

static PyTypeObject BitStreamType = {
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "my_module.BitStream",
    .tp_dealloc = (destructor) _BitStream_dealloc,
    .tp_basicsize = sizeof(BitStream),
    .tp_itemsize = sizeof(uint8_t),
    .tp_flags = Py_TPFLAGS_DEFAULT,
};

我公开了一种方法来创建它的实例,并在数据数组中具有一定数量的字节:

static PyObject *
of_bytes(PyObject *self, PyObject *obj)
{
    unsigned long size = PyLong_AsUnsignedLong(obj);
    BitStream *bstream = (BitStream *) BitStreamType.tp_alloc(&BitStreamType, size);
    if (bstream == NULL) {
        return NULL;
    }

    return (PyObject *) bstream;
}

我希望of_bytes of_bytes(0)的大小尽可能接近 0,并且of_bytes(1)的大小接近 1,等等。

很遗憾:

>>> sys.getsizeof(0)
24
>>> sys.getsizeof(of_bytes(0))
32

为什么它比int大?

我怎样才能减小它的大小?

只有当两个对象都必须表示超过 937 位的数字时,它才会始终小于 int:

>>> sys.getsizeof(2 ** 937)
152
>>> sys.getsizeof(of_bytes(math.ceil(937 / 8)))
150

对于比这更多的字节/位, int 永远不会再小于它。

但是对于存储的任意数量的位,我希望它小于或至少与 int 相同。

或者,由于我只需要字节数组uint8_t *data ,有没有另一种方法可以在没有 32 字节 PyObject 包装器的情况下将这样的数组返回到我的代码中?

现在我实现了 24 字节的大小 + 但是data中有很多字节。

必须使用uint8_t data[1]而不是uint8_t *data

然后需要用PyObject_InitVar分配 memory 。

typedef struct {
    PyObject_VAR_HEAD
    uint8_t data[1];
} BitStream;

static PyTypeObject BitStreamType = {
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "my_module.BitStream",
    .tp_dealloc = 0,
    .tp_free = PyObject_Del,
    .tp_basicsize = offsetof(BitStream, data),
    .tp_itemsize = sizeof(uint8_t),
    .tp_flags = Py_TPFLAGS_DEFAULT,
};

static BitStream *
_BitStream_New(size_t size)
{
    BitStream *bstream = (BitStream *) PyObject_Malloc(offsetof(BitStream, data) + size);
    if (!bstream) {
        PyErr_NoMemory();
        return NULL;
    }
    PyObject_InitVar((PyVarObject*)bstream, &BitStreamType, size);
    return bstream;
}

到目前为止它一直在工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM