python pandas数据类型与占用内存--优化

一、疑难杂症

  最近使用pandas计算时,总是感觉dataframe占用内存过大,内存不足,导致计算时间被拉长。于是,趁着周末一探究竟。找到一个原因,与大家分享!

二、探寻原因

  首先,pandas底层数据存储与计算是基于numpy的。通过查找资料我们发现,pandas的主要类型主要是下表的第一列。这几类是pandas的数据大类,后面的 Numpy type是其包含的小雷。在我们利用pandas读取数据时,尤其是数值型数据时,他会默认启用大类来定义数据类型。比如:表里只有数字1或者1.0,就会被定义为int64或者float64。作为充分考虑数据的多变性,这种行为是没有疑义的。但是,but,他就是消耗了内存。 在这里插入图片描述
  常用数据类型的占用内存情况如下:
在这里插入图片描述

flaottype =['float32','float64']
inttypes = ["uint8", "int8", "int16",'float32']
for it in inttypes:
    print(np.iinfo(it))
# 这段代码可以输出数据类型的表示范围。

  知道了这些不同类型的数据类型占用的内存大小,再进一步掌握自己实际操作的数据的范围,就可以选择合适的数据类型,这样可以节省内存,优化计算。

三、方案

  放一个操作的demo。大家可以结合实际进行操作。前后的内训占用节省了月65%欢迎指正!

df3.info()
输出
<class 'pandas.core.frame.DataFrame'>
Index: 34519 entries, a to m
Data columns (total 17 columns):
.......省略........
dtypes: float64(7), int64(10)
memory usage: 6.0+ MB --------------默认读取的类型,占用内存
df4 = df3.astype(np.int8)
输出
<class 'pandas.core.frame.DataFrame'>
Index: 34519 entries, a to m
Data columns (total 17 columns):
.......省略........
dtypes: int8(17)
memory usage: 2.1+ MB---------------astype修改后的,占用内存

参考:
https://pbpython.com/pandas_dtypes.html
https://blog.csdn.net/wj1066/article/details/81124959

发布了25 篇原创文章 · 获赞 14 · 访问量 1153

猜你喜欢

转载自blog.csdn.net/A_pinkpig/article/details/104602919