sys.getsizeof处理含类型的Pandas Series/DataFrame报错的解决方法
解决sys.getsizeof处理str类型Pandas Series/DataFrame时的TypeError问题
错误原因
你遇到的TypeError: descriptor '__sizeof__' of 'str' object needs an argument,本质是代码误将类型本身(比如str)传给了sys.getsizeof,而非该类型的实例对象(比如'abc')。__sizeof__是实例方法,必须绑定到具体实例才能调用,直接调用类型的__sizeof__就会触发这个错误。在处理Pandas的object类型(存储str)Series/DataFrame时,通常是遍历元素时误取了元素类型而非实例导致的。
解决办法
根据你要计算的目标(整个Pandas对象内存/元素内存总和),选择对应的方案:
1. 计算Pandas对象的实际内存占用(推荐)
直接用Pandas内置的.memory_usage()方法,它能准确计算包含元素在内的总内存,比sys.getsizeof更适合Pandas对象:
import pandas as pd # 计算Series的总内存(deep=True会计算object类型元素的实际大小) str_series = pd.Series(['a', 'bc', 'def']) print(str_series.memory_usage(deep=True)) # 计算DataFrame的总内存 str_df = pd.DataFrame({'col1': ['x', 'yz'], 'col2': ['foo', 'bar']}) print(str_df.memory_usage(deep=True).sum())
2. 必须使用sys.getsizeof的场景
如果一定要用sys.getsizeof,确保传入的是实例对象而非类型:
- 遍历Series元素计算总大小:
import sys import pandas as pd str_series = pd.Series(['a', 'bc', 'def']) total_element_size = sum(sys.getsizeof(elem) for elem in str_series) print(total_element_size)
- 计算Series对象本身的内存开销(不包含元素数据):
print(sys.getsizeof(str_series))
3. 通用安全计算函数
写一个适配多种类型的函数,自动处理Pandas对象和普通对象,避免错误:
import sys import pandas as pd def safe_calculate_size(obj): if isinstance(obj, (pd.Series, pd.DataFrame)): return obj.memory_usage(deep=True).sum() # 处理可迭代对象(排除字符串/字节,避免被当成迭代器遍历) elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)): return sum(sys.getsizeof(item) for item in obj) else: return sys.getsizeof(obj) # 测试示例 print(safe_calculate_size(pd.Series(['hello', 'world']))) print(safe_calculate_size('test string')) print(safe_calculate_size([1, 2, 3, 'abc']))
内容的提问来源于stack exchange,提问作者ArunJose
相关产品推荐
相关产品推荐

