Pandas、Numpy性能优化秘籍(全)

简介: pandas、numpy是Python数据科学中非常常用的库,numpy是Python的数值计算扩展,专门用来处理矩阵,它的运算效率比列表更高效。pandas是基于numpy的数据处理工具,能更方便的操作大型表格类型的数据集。但是,随着数据量的剧增,有时numpy和pandas的速度就成瓶颈。

pandas、numpy是Python数据科学中非常常用的库,numpy是Python的数值计算扩展,专门用来处理矩阵,它的运算效率比列表更高效。pandas是基于numpy的数据处理工具,能更方便的操作大型表格类型的数据集。但是,随着数据量的剧增,有时numpy和pandas的速度就成瓶颈。


如下我们会介绍一些优化秘籍:里面包含了 代码层面的优化,以及可以无脑使用的性能优化扩展包。


1、NumExpr


NumExpr 是一个对NumPy计算式进行的性能优化。NumExpr的使用及其简单,只需要将原来的numpy语句使用双引号框起来,并使用numexpr中的evaluate方法调用即可。经验上看,数据有上万条+ 使用NumExpr才比较优效果,对于简单运算使用NumExpr可能会更慢。如下较复杂计算,速度差不多快了5倍。


importnumexprasne importnumpyasnp a=np.linspace(0,1000,1000) print('#numpy十次幂计算') %timeita**10 print('#numexpr十次幂计算') %timeitne.evaluate('a**10')



2、Numba


Numba 使用行业标准的LLVM编译器库在运行时将 Python 函数转换为优化的机器代码。Python 中 Numba 编译的数值算法可以接近 C 或 FORTRAN 的速度。



如果在你的数据处理过程涉及到了大量的数值计算,那么使用numba可以大大加快代码的运行效率(一般来说,Numba 引擎在处理大量数据点 如 1 百万+ 时表现出色)。


numba使用起来也很简单,因为numba内置的函数本身是个装饰器,所以只要在自己定义好的函数前面加个@nb.方法就行,简单快捷!


#pipinstallnumba importnumbaasnb #用numba加速的求和函数 @nb.jit() defnb_sum(a): Sum=0 foriinrange(len(a)): Sum+=a[i] returnSum #没用numba加速的求和函数 defpy_sum(a): Sum=0 foriinrange(len(a)): Sum+=a[i] returnSum importnumpyasnp a=np.linspace(0,1000,1000)#创建一个长度为1000的数组 print('#python求和函数') %timeitsum(a) print('#没加速的for循环求和函数') %timeitpy_sum(a) print('#numba加速的for循环求和函数') %timeitnb_sum(a) print('#numpy求和函数') %timeitnp.sum(a)


当前示例可以看出,numba甚至比号称最接近C语言速度运行的numpy还要快5倍+,对于python求和速度快了几百倍。。


此外,Numba还支持GPU加速、矢量化加速方法,可以进一步达到更高的性能。


fromnumbaimportcuda cuda.select_device(1) @cuda.jit defCudaSquare(x): i,j=cuda.grid(2) x[i][j]*=x[i][j] #numba的矢量化加速 frommathimportsin @nb.vectorize() defnb_vec_sin(a): returnsin(a)


3、CuPy


CuPy 是一个借助 CUDA GPU 库在英伟达 GPU 上实现 Numpy 数组的库。基于 Numpy 数组的实现,GPU 自身具有的多个 CUDA 核心可以促成更好的并行加速。


#pipinstallcupy importnumpyasnp importcupyascp importtime ###numpy s=time.time() x_cpu=np.ones((1000,1000,1000)) e=time.time() print(e-s) ###CuPy s=time.time() x_gpu=cp.ones((1000,1000,1000)) e=time.time() print(e-s)


上述代码,Numpy 创建(1000, 1000, 1000)的数组用了 1.68 秒,而 CuPy 仅用了 0.16 秒,实现了 10.5 倍的加速。随着数据量的猛增,CuPy的性能提升会更为明显。


4、pandas使用技巧


更多pandas性能提升技巧请戳官方文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/enhancingperf.html


4.1 按行迭代优化


我们按行对dataframe进行迭代,一般我们会用iterrows这个函数。在新版的pandas中,提供了一个更快的itertuples函数,如下可以看到速度快了几十倍。


importpandasaspd importnumpyasnp importtime df=pd.DataFrame({'a':np.random.randn(100000), 'b':np.random.randn(100000), 'N':np.random.randint(100,1000,(100000)), 'x':np.random.randint(1,10,(100000))}) %%timeit a2=[] forrowindf.itertuples(): temp=getattr(row,'a') a2.append(temp*temp) df['a2']=a2 %%timeit a2=[] forindex,rowindf.iterrows(): temp=row['a'] a2.append(temp*temp) df['a2']=a2



4.2 apply、applymap优化


当对于每行执行类似的操作时,用循环逐行处理效率很低。这时可以用apply或applymap搭配函数操作,其中apply是可用于逐行计算,而applymap可以做更细粒度的逐个元素的计算。


#列a、列b逐行进行某一函数计算 df['a3']=df.apply(lambdarow:row['a']*row['b'],axis=1) #逐个元素保留两位小数 df.applymap(lambdax:"%.2f"%x)



4.3 聚合函数agg优化


对于某列将进行聚合后,使用内置的函数比自定义函数效率更高,如下示例速度加速3倍

%timeitdf.groupby("x")['a'].agg(lambdax:x.sum()) %timeitdf.groupby("x")['a'].agg(sum) %timeitdf.groupby("x")['a'].agg(np.sum)



4.4 文件操作


pandas读取文件,pkl格式的数据的读取速度最快,其次是hdf格式的数据,再者是读取csv格式数据,而xlsx的读取是比较慢的。但是存取csv有个好处是,这个数据格式通用性更好,占用内存硬盘资源也比较少。此外,对于大文件,csv还可以对文件分块、选定某几列、指定数据类型做读取。



4.5 pandas.eval


pandas.eval 是基于第一节提到的numexpr,pandas也是基于numpy开发的,numexpr同样可以被用来对pandas加速)。使用eval表达式的一个经验是数据超过 10,000 行的情况下使用会有明显优化效果。


importpandasaspd nrows,ncols=20000,100 df1,df2,df3,df4=[pd.DataFrame(np.random.randn(nrows,ncols))for_inrange(4)] print('pd') %timeitdf1+df2+df3+df4 print('pd.eval') %timeitpd.eval("df1+df2+df3+df4")



5、Cython优化


Cython是一个基于C语言的Python 编译器,在一些计算量大的程序中,可以Cython来实现相当大的加速。考虑大部分人可能都不太了解复杂的cython语句,下面介绍下Cython的简易版使用技巧。通过在Ipython加入 Cython 魔术函数%load_ext Cython,如下示例就可以加速了一倍。进一步再借助更高级的cython语句,还是可以比Python快个几十上百倍。


%%cython deff_plain(x): returnx*(x-1) defintegrate_f_plain(a,b,N): s=0 dx=(b-a)/N foriinrange(N): s+=f_plain(a+i*dx) returns*dx



6、swifter


swifter是pandas的插件,可以直接在pandas的数据上操作。Swifter的优化方法检验计算是否可以矢量化或者并行化处理,以提高性能。如常见的apply就可以通过swifter并行处理。


importpandasaspd importswifter df.swifter.apply(lambdax:x.sum()-x.min())


7、Modin


Modin后端使用dask或者ray(dask是类似pandas库的功能,可以实现并行读取运行),是个支持分布式运行的类pandas库,简单通过更改一行代码import modin.pandas as pd就可以优化 pandas,常用的内置的read_csv、concat、apply都有不错的加速。注:并行处理的开销会使小数据集的处理速度变慢。



!pipinstallmodin importpandas importmodin.pandasaspd importtime ##pandas pandas_df=pandas.DataFrame({'a':np.random.randn(10000000), 'b':np.random.randn(10000000), 'N':np.random.randint(100,10000,(10000000)), 'x':np.random.randint(1,1000,(10000000))}) start=time.time() big_pandas_df=pandas.concat([pandas_dffor_inrange(25)]) end=time.time() pandas_duration=end-start print("Timetoconcatwithpandas:{}seconds".format(round(pandas_duration,3))) ####modin.pandas modin_df=pd.DataFrame({'a':np.random.randn(10000000), 'b':np.random.randn(10000000), 'N':np.random.randint(100,10000,(10000000)), 'x':np.random.randint(1,1000,(10000000))}) start=time.time() big_modin_df=pd.concat([modin_dffor_inrange(25)]) end=time.time() modin_duration=end-start print("TimetoconcatwithModin:{}seconds".format(round(modin_duration,3))) print("Modinis{}xfasterthanpandasat`concat`!".format(round(pandas_duration/modin_duration,2)))


相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
14天前
|
SQL 数据挖掘 索引
12种Numpy&Pandas高效技巧
12种Numpy&Pandas高效技巧
|
29天前
|
数据采集 数据挖掘 数据处理
Python数据分析:Numpy、Pandas高级
在上一篇博文中,我们介绍了Python数据分析中NumPy和Pandas的基础知识。本文将深入探讨NumPy和Pandas的高级功能,并通过一个综合详细的例子展示这些高级功能的应用。
|
30天前
|
数据采集 数据挖掘 数据处理
Python数据分析:Numpy、Pandas基础
本文详细介绍了 Python 中两个重要的数据分析库 NumPy 和 Pandas 的基础知识,并通过一个综合的示例展示了如何使用这些库进行数据处理和分析。希望通过本篇博文,能更好地理解和掌握 NumPy 和 Pandas 的基本用法,为后续的数据分析工作打下坚实的基础。
|
13天前
|
存储 数据采集 数据挖掘
NumPy 与 Pandas 的无缝集成
【8月更文第30天】在 Python 数据科学领域,NumPy 和 Pandas 是两个非常重要的库。NumPy 提供了高性能的多维数组对象以及对其进行操作的工具,而 Pandas 则是在 NumPy 的基础上增加了数据结构和数据分析工具,使得数据处理更加直观和便捷。本文将探讨 NumPy 和 Pandas 如何结合使用以增强数据处理和分析的能力。
15 0
|
13天前
|
存储 并行计算 测试技术
NumPy 性能优化:提升 Python 数值计算的速度
【8月更文第30天】Python 是一种广泛使用的编程语言,在科学计算领域尤其受欢迎。然而,由于 Python 的动态类型和解释执行机制,其在处理大规模数值数据时可能会显得相对较慢。为了克服这一限制,NumPy(Numerical Python)库提供了高性能的多维数组对象以及一系列用于操作这些数组的函数。本文将探讨如何利用 NumPy 来提高 Python 中数值运算的效率。
15 0
|
2月前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
|
2月前
|
机器学习/深度学习 数据采集 数据处理
重构数据处理流程:Pandas与NumPy高级特性在机器学习前的优化
【7月更文挑战第14天】在数据科学中,Pandas和NumPy是数据处理的关键,用于清洗、转换和计算。用`pip install pandas numpy`安装后,Pandas的`read_csv`读取数据,`fillna`处理缺失值,`drop`删除列。Pandas的`apply`、`groupby`和`merge`执行复杂转换。NumPy加速数值计算,如`square`进行向量化操作,`dot`做矩阵乘法。结合两者优化数据预处理,提升模型训练效率和效果。
34 1
|
2月前
|
数据采集 机器学习/深度学习 数据处理
从基础到卓越:Pandas与NumPy在复杂数据处理中的实战策略
【7月更文挑战第14天】Pandas与NumPy在数据科学中的核心应用:**加载数据(如`read_csv`)、探索(`head()`, `info()`, `describe()`)、数据清洗(`fillna`, `dropna`, `replace`, `apply`)、数值计算(借助NumPy的`ndarray`)、分组聚合(`groupby`与聚合函数)、窗口函数(如`rolling`)和数据筛选排序(布尔索引,`query`,`sort_values`)。通过这些工具,实现从数据预处理到复杂分析的高效处理。
33 0
|
2月前
|
数据采集 数据挖掘 数据处理
Python数据分析加速器:深度挖掘Pandas与NumPy的高级功能
【7月更文挑战第14天】Python的Pandas和NumPy库是数据分析的核心工具。Pandas以其高效的数据处理能力,如分组操作和自定义函数应用,简化了数据清洗和转换。NumPy则以其多维数组和广播机制实现快速数值计算。两者协同工作,如在DataFrame与NumPy数组间转换进行预处理,提升了数据分析的效率和精度。掌握这两者的高级功能是提升数据科学技能的关键。**
27 0
|
2月前
|
数据采集 机器学习/深度学习 数据处理
数据科学家的秘密武器:Pandas与NumPy高级应用实战指南
【7月更文挑战第14天】Pandas与NumPy在数据科学中扮演关键角色。Pandas的DataFrame和Series提供高效数据处理,如数据清洗、转换,而NumPy则以ndarray为基础进行数值计算和矩阵操作。两者结合,从数据预处理到数值分析,形成强大工具组合。示例展示了填充缺失值、类型转换、矩阵乘法、标准化等操作,体现其在实际项目中的协同效用。掌握这两者,能提升数据科学家的效能和分析深度。**
27 0