有啥方法可以通过 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 的情况下获取特定主题标签的 Instagram 图像?
有啥方法可以获取具有装饰器、Python、Django 的视图名称列表
有啥方法可以从 google contact api v3 检索 account_id 以向 google people api 发出获取请求?