[英]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.