为什么Pandas中的内存使用情况报告的整数与对象dtype的数字相同?

时间:2019-04-18 17:37:46

标签: python pandas

我试图了解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)的数字相同?

1 个答案:

答案 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的数量。通过深入的内存自省,   实际内存使用量计算的代价是   计算资源。