我试图了解Pandas中整数和字符串(对象)dtype之间的内存使用差异。
import pandas as pd
df_int = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'), dtype=int)
正如预期的那样,这需要大约3.2 KB的内存,因为每一列都是64位整数
In [38]: df_int.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 4 columns):
A 100 non-null int64
B 100 non-null int64
C 100 non-null int64
D 100 non-null int64
dtypes: int64(4)
memory usage: 3.2 KB
但是,当我尝试将其初始化为字符串时,它告诉我它具有大致相同的内存使用量
import pandas as pd
df_str = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'), dtype=str)
In [40]: df_str.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 4 columns):
A 100 non-null object
B 100 non-null object
C 100 non-null object
D 100 non-null object
dtypes: object(4)
memory usage: 3.2+ KB
当我使用sys.getsizeof
时,区别很明显。对于仅包含64位整数的数据帧,其大小约为3.3 KB(包括24字节的数据帧开销)
In [44]: sys.getsizeof(df_int)
Out[44]: 3304
对于使用整数转换为字符串初始化的数据帧,它接近24 KB
In [42]: sys.getsizeof(df_str)
Out[42]: 23984
为什么Pandas中的内存使用情况报告的整数与字符串(对象dtype)的数字相同?
答案 0 :(得分:2)
在docs之后,使用'deep'
获取实际值(否则为估计值)
df_str.info(memory_usage='deep')
#<class 'pandas.core.frame.DataFrame'>
#RangeIndex: 100 entries, 0 to 99
#Data columns (total 4 columns):
#A 100 non-null object
#B 100 non-null object
#C 100 non-null object
#D 100 non-null object
#dtypes: object(4)
#memory usage: 23.3 KB
“ deep”的值等同于“真正的内省”。 内存使用情况以可读单位(以2为基数的表示形式)显示。 无需深入自省,就可以根据列进行内存估计 dtype和假设值占用相同内存的行数 相应dtype的数量。通过深入的内存自省, 实际内存使用量计算的代价是 计算资源。