程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何减少我的自定义 python 类型的大小?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发过程中遇到如何减少我的自定义 python 类型的大小?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何减少我的自定义 python 类型的大小?的解决方法建议,希望对你解决如何减少我的自定义 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,请注明来意。
标签: