You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:53:35