本文主要是介绍python sys.getsizeof 详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
sys.getsizeof 是 Python 标准库中的一个函数,用于获取一个对象在内存中占用的字节数。这个函数直接返回对象的大小,而不考虑对象引用的其他对象的大小。
使用 sys.getsizeof 的基本示例
import sys# 基本类型的内存占用
x = 12345
print(f"Size of integer: {sys.getsizeof(x)} bytes")y = "Hello, world!"
print(f"Size of string: {sys.getsizeof(y)} bytes")z = [1, 2, 3, 4, 5]
print(f"Size of list: {sys.getsizeof(z)} bytes")
输出示例
Size of integer: 28 bytes
Size of string: 62 bytes
Size of list: 96 bytes
对类实例的使用
当使用 sys.getsizeof 获取类实例的内存占用时,只能得到实例本身的大小,不包括其引用的其他对象的大小:
import sysclass MyClass:def __init__(self, name, data):self.name = nameself.data = dataobj = MyClass("example", [1, 2, 3, 4, 5])
print(f"Size of object: {sys.getsizeof(obj)} bytes")# 查看嵌套对象的大小
name_size = sys.getsizeof(obj.name)
data_size = sys.getsizeof(obj.data)
print(f"Size of name: {name_size} bytes")
print(f"Size of data: {data_size} bytes")
输出示例
Size of object: 48 bytes
Size of name: 55 bytes
Size of data: 96 bytes
在这个示例中,sys.getsizeof 仅返回对象 obj 本身的大小,不包括其属性 name 和 data 所引用对象的大小。因此,我们还需要分别计算 name 和 data 的大小。
递归计算对象的总大小
为了准确计算一个对象及其引用对象的总内存占用,可以使用递归方法。下面是一个示例,使用递归函数计算对象及其引用对象的总内存占用:
import sys
from collections.abc import Iterabledef get_total_size(obj, seen=None):"""计算对象及其引用对象的总内存占用"""size = sys.getsizeof(obj)if seen is None:seen = set()obj_id = id(obj)if obj_id in seen:return 0seen.add(obj_id)if isinstance(obj, dict):size += sum([get_total_size(v, seen) for v in obj.values()])size += sum([get_total_size(k, seen) for k in obj.keys()])elif hasattr(obj, '__dict__'):size += get_total_size(obj.__dict__, seen)elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):size += sum([get_total_size(i, seen) for i in obj])return sizeclass MyClass:def __init__(self, name, data):self.name = nameself.data = dataobj = MyClass("example", [1, 2, 3, 4, 5])# 计算对象及其引用对象的总内存占用
total_size = get_total_size(obj)
print(f"Total memory size of object: {total_size} bytes")
总结
- sys.getsizeof:计算单个对象的内存占用,但不包括引用对象。适用于简单情况。
- 递归计算总大小:使用递归函数计算对象及其引用对象的总内存占用,适用于需要精确测量复杂对象的内存占用情况。
对于准确计算对象的总内存占用,推荐使用递归方法,或使用第三方库如 pympler 进行更复杂的内存分析。
这篇关于python sys.getsizeof 详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!