大佬教程收集整理的这篇文章主要介绍了如何减少我的自定义 python 类型的大小?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了自己的自定义 Python 类型。它存储一个内部字节数组。即使数组中没有字节,对象也会占用 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(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
来分配内存。
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;
}
到目前为止它一直在工作。
以上是大佬教程为你收集整理的如何减少我的自定义 python 类型的大小?全部内容,希望文章能够帮你解决如何减少我的自定义 python 类型的大小?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。