有啥方法可以通过 Python 中的 id 获取对象的大小?

Posted

技术标签:

【中文标题】有啥方法可以通过 Python 中的 id 获取对象的大小?【英文标题】:Is there any way to get the size of an object by its id in Python?有什么方法可以通过 Python 中的 id 获取对象的大小? 【发布时间】:2021-11-24 12:20:39 【问题描述】:

我需要编写一个通过 id 返回对象的函数。我不能使用ctypes.cast、_ctypes、gc、locals、globals等,建议使用struct和ctypes。例如,对于一个 int 类型的对象,我写如下:

struct.unpack ("LLli", ctypes.string_at (id_of_object, 28))

如果我知道对象的大小是 28 字节。但是对象可以是任意大小。例如,对于 object = 2**30,大小将为 32 字节。我可以通过它的 id 以某种方式获取对象本身的大小吗?或者我需要在这个任务中使用其他方法吗?

【问题讨论】:

您是否已经阅读了here 和here 的答案? 为什么不能你使用ctypes.cast可以使用ctypes.string_at?这是一个奇怪的限制。正如前面评论中的链接所指出的,无论如何这都不是一个好主意。 这只是学习任务,我想我们的导师希望我们了解不同的对象在内存中的位置。 很公平。但我建议从 CTypes 类型开始(你知道布局)。然后并且只有在那时(当您对 CPython 实现细节有足够的经验时)才转移到通用对象。 【参考方案1】:

任何对象都以引用计数和引用类型开始。我的问题可以这样解决:首先,使用 ctypes.string_at,我们得到一个类型的引用,它将是元组中的第二个:

struct.unpack ("LL", ctypes.string_at (object_id, 16))

那么,例如在int类型的情况下,我们得到对象的“块”数,它将是元组中的第三个:

info = struct.unpack ("LLl", ctypes.string_at (object_id, 24))

最后,我们得到整数:

num_of_pieces = abs (info [2])
size_of_obj = 24 + 4 * num_of_pieces
type_string = "i" * num_of_pieces
number = struct.unpack ("LLl" + type_string, ctypes.string_at (object_id, size_of_obj))
i = 0
res = 0
for n in number [3:]:
    res + = n * (2 ** 30) ** i
    i + = 1
return res if info [2]> 0 else -res

对于其他类型,一切都会有所不同,我必须分别处理每种情况。

【讨论】:

以上是关于有啥方法可以通过 Python 中的 id 获取对象的大小?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以使用 mongoose 从 mongodb 批量操作中获取修改后的 IDS?

由进程ID获得进程名或路径有啥方法

有啥方法可以在不使用访问令牌/客户端 ID 的情况下获取特定主题标签的 Instagram 图像?

有啥方法可以获取具有装饰器、Python、Django 的视图名称列表

有啥方法可以从 google contact api v3 检索 account_id 以向 google people api 发出获取请求?

python中的迭代器有啥用