《暴减内存!Pandas 自动优化骚操作.docx》由会员分享,可在线阅读,更多相关《暴减内存!Pandas 自动优化骚操作.docx(5页珍藏版)》请在第一文库网上搜索。
1、暴减内存! Pandas三动优化骚操作导读:本文主题,自动优化数据类型,暴省内存!平日工作里经常会听到周边小伙伴说:我X,内存又爆了 !对于这样的话我听了不下百遍。正因为如此,在资源有限的情况下,我们都是变着法的减少内存占用,一些常用的方法如:1. gc. collect 和 del 回收2. 使用csv的替代品,如feather. Parquet3. 优化代码,尽量使用Numpy矩阵代替for循环和apply4. .本次再分享一个骚操作,就是通过改变数据类型来压缩内存空间,可以延伸到所有数据类型。正常情况下,pandas会给数据列自动设置默认的数据类型,其中最令人讨厌并且最消耗内存的数据类型
2、就是object(O),这也恰好限制了 pandas的一些功能。下面是pandas、Python、Numpy的数据类型列表,对比你就发现pandas的数据类型是有很大优化空间的。Pandas dtypePythontypeNumPy typeUsageobjectstrstring- UnicodeTextint64intint, int8, intl6, int32, int64, uint8, uintl6, uint32, uint64Integer numbersfloat64floatfloat, float 16, float32, fl oat 64Floating point
3、numbersPandas dtypePythontypeNumPy typeUsageboolboolbool_True/False valuesdatetime64NAdatctime64nsDate and time valuestimedeltansNANADifferences betweentwo datetimescategoryNANAFinite list of textvalues来源:http : /pbpython. com/pandas_dtypes, html很多默认的数据类型占用很多内存空间,其实根据没有必要,我们完全可以压缩到可能小的子类型。Data typDe
4、scriptionebool Boolean(True or False) stored as a byteDefault integer type (same as C long ; normally either int64orint、一int32)intcIdentical to C int(normally int32 or int64)Integer used for indexing (same as C ssize_t; normally either iintp、nt32 or int64)int8Byte(-128 to 127)intl6Integer(-32768 to
5、32767)int32Integer(-2147483648 to 2147483647)int64Integer(-9223372036854775808to9223372036854775807)uint8Unsignedinteger(0to255)uintl6Unsignedinteger(0to65535)Iuint32Unsignedinteger(0to4294967295)uint64Unsignedinteger(0to18446744073709551615)float_ Shorthand for float64.floatl6 Half precision float:
6、 sign bit, 5 bits exponent, 10 bits mantissData typDescriptioneaSingle precision float: sign bit, 8 bits exponent, 23 bits mantifloat32ssaDouble precision float: sign bit,11 bits exponent,52 bits mantfloat64issacomplexShorthand for plex6 Complex number, represented by two 32-bit floats (real and ima
7、g4inary components)1comp1ex1Complex number, represented by two 64-bit floats(real and imag28 inary components)来源:https:/docs.scipy.org/doc/numpy-1. 13.O/user/basics.types, html上面是scipy文档中列出的所有数据类型,从简单到复杂。我们希望将类型简单化,以此节省内存,比如将浮点数转换为floatl6/32 ,或者将具有正整数和负整数的列转为int8/16/32 ,还可以将布尔值转换为uint8 ,甚至仅使用正整数来进一步
8、减少内存消耗。基于上面所说的变量类型简化的思考,写出一个自动转化的函数,它可以根据上表将浮点数和整数转换为它们的最小子类型:def reduce_memory_usage(dfverbose=True):numerics = intS,int32, int64, floatie, “float32, float64start_mem = df.memory_usage()sum() / 1024 * 2for col in df.columns:col_type = dfcol.dtypesif col_type in numerics:c_min = dfcol.min()c_max = d
9、fcol.max()if str(col_type):3 = int”:if c_min np.iinfo(np.int8).min and c_max np.iinfo(np.intl6).min and c_max np.iinfo(np.int32).min and c_max np.iinfo(np.int64).min and c_max np.finfo(np.float16).minand c_max np.finfo(np.float32).minand c_max reduce_memory_usage(tps_october)Mem. usage decreased to 509.26 Mb (76.9% reduction)数据集的内存占用从原来的2.2GB压缩到510MBe不要小看这个压缩量,因为数据分析或者建模的过程中,要做很多数据处理操作,就这导致数据集会被重复使用很多次。如果开始的数据集就很大,那么后面的内存占用也会跟着大,这样一算下来整个就放大了很多倍。但有一点需要提示一下,尽管在我们运行时会减少内存,但当我们保存数据时,内存减少的效果会丢失掉,不过磁盘空间往往是够用的,这个影响没那么大。-END -