如图所示, pandas 默认会按照数据类型分组存储. 分组存储的每个块中并不包含数据列名, 这是因为块只维护数据的实际存储值. 而由 BlockManager 类来维护列和索引与实际块之间的映射.
pandas 每个数据类型类都在 pandas.core.internals
中. 对于字符串和混合类型, 使用 ObjectBlock. 对于 float 会使用 FloatBlock. 针对 int 和 float 的列, pandas 会将其存储为 Numpy ndarray.
在pandas 中, 默认存储 string 的 object 类型 (使用可变数量的内存) 和 python 对 string 的存储方式是一致的.
因为Python是一种高级解释语言,所以它没有对内存中的值的存储方式进行细粒度控制。
此限制导致字符串以碎片方式存储,消耗更多内存并且访问速度较慢。对象列中的每个元素实际上都是一个指针,其中包含实际值在内存中的位置的“地址”。
下面的图表显示了数字数据如何存储在NumPy数据类型中,以及如何使用Python的内置类型存储字符串
dataframe.info(memory_usage='deep')
for dtype in ['float','int','object']:
selected_dtype = gl.select_dtypes(include=[dtype])
mean_usage_b = selected_dtype.memory_usage(deep=True).mean()
mean_usage_mb = mean_usage_b / 1024 ** 2
print("Average memory usage for {} columns: {:03.2f} MB".format(dtype,mean_usage_mb))