0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解Python中的Pandas和Numpy库

数据分析与开发 来源:算法进阶 作者:泳鱼 2022-05-25 12:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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')
7f5cc27c-d69d-11ec-bce3-dac502259ad0.png

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)

7fdd3272-d69d-11ec-bce3-dac502259ad0.png

当前示例可以看出,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


80296156-d69d-11ec-bce3-dac502259ad0.png

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)
8040ae24-d69d-11ec-bce3-dac502259ad0.png

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)
808b3192-d69d-11ec-bce3-dac502259ad0.png

4.4 文件操作

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

80dab5d2-d69d-11ec-bce3-dac502259ad0.png

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")
8107c784-d69d-11ec-bce3-dac502259ad0.png

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
811fcdac-d69d-11ec-bce3-dac502259ad0.png

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都有不错的加速。注:并行处理的开销会使小数据集的处理速度变慢。

818efa88-d69d-11ec-bce3-dac502259ad0.png

!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)))

81bc89b2-d69d-11ec-bce3-dac502259ad0.png

原文标题:Pandas、Numpy 性能优化秘籍

文章出处:【微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据处理
    +关注

    关注

    0

    文章

    642

    浏览量

    29802
  • python
    +关注

    关注

    57

    文章

    4857

    浏览量

    89559
  • 性能优化
    +关注

    关注

    0

    文章

    18

    浏览量

    7603

原文标题:Pandas、Numpy 性能优化秘籍

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Python调用API教程

    两个不同系统之间的信息交互。在这篇文章,我们将详细介绍Python调用API的方法和技巧。 一、用Requests发送HTTP请求 使用Python调用API的第一步是发送HTTP
    的头像 发表于 11-03 09:15 320次阅读

    Python 给 Amazon 做“全身 CT”——可量产、可扩展的商品详情爬虫实战

    一、技术选型:为什么选 Python 而不是 Java? 结论: “调研阶段用 Python,上线后如果 QPS 爆表再考虑 Java 重构。” 二、整体架构速览(3 分钟看懂) 三、开发前准备(5
    的头像 发表于 10-21 16:59 386次阅读
    用 <b class='flag-5'>Python</b> 给 Amazon 做“全身 CT”——可量产、可扩展的商品详情爬虫实战

    termux如何搭建python游戏

    计算(如Numpy,用于物理引擎) pip install numpy # 交互增强工具(如IPython,便于调试) pip install ipython ``` 三、终端优化与开发
    发表于 08-29 07:06

    yolov11转kmodel,numpy是要降级为1.x吗?

    python3.9,yolo是最新的稳定版,和yolo捆绑pip安装的numpy是2.0.1 错误日志
    发表于 08-11 08:16

    linux虚拟环境调用Linux 版matlab编译的python时出错

    matlab代码编译为CAO_pythonpython,其中cp_Main_python.m为入口文件,编译后生成的文件有mccExcludedFiles.log、setup.py
    发表于 07-18 10:40

    达梦数据常用管理SQL命令详解

    达梦数据常用管理SQL命令详解
    的头像 发表于 06-17 15:12 6560次阅读
    达梦数据<b class='flag-5'>库</b>常用管理SQL命令<b class='flag-5'>详解</b>

    python入门圣经-高清电子书(建议下载)

    此资料内容是一本针对所有层次的Python 读者而作的Python 入门电子书。 全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy
    发表于 04-10 16:53

    ​如何在虚拟环境中使用 Python,提升你的开发体验~

    。RaspberryPiOS预装了Python3。干扰系统Python的安装可能会给你的操作系统带来问题。安装第三方Python时,请务必使用正确的包管理工具。在Lin
    的头像 发表于 03-25 09:34 628次阅读
    ​如何在虚拟环境中使用 <b class='flag-5'>Python</b>,提升你的开发体验~

    Python在嵌入式系统的应用场景

    你想把你的职业生涯提升到一个新的水平?Python在嵌入式系统中正在成为一股不可缺少的新力量。尽管传统上嵌入式开发更多地依赖于C和C++语言,Python的优势在于其简洁的语法、丰富的和快速的开发周期,这使得它在某些嵌入式场景
    的头像 发表于 03-19 14:10 1186次阅读

    电力电子的坐标变换详解

    电力电子的坐标变换详解 clark变换&park变换
    发表于 02-17 15:28 1次下载

    深度学习入门:简单神经网络的构建与实现

    深度学习,神经网络是核心模型。今天我们用 PythonNumPy 构建一个简单的神经网络。 神经网络由多个神经元组成,神经元之间通过权重连接。我们构建一个包含输入层、隐藏层和输出层的简单
    的头像 发表于 01-23 13:52 838次阅读

    使用Python实现xgboost教程

    装: bash复制代码conda install -c conda-forge xgboost 2. 导入必要的 在你的Python脚本或Jupyter Notebook,导入必要的
    的头像 发表于 01-19 11:21 2207次阅读

    适用于MySQL和MariaDB的Python连接器:可靠的MySQL数据连接器和数据

    和 MariaDB 数据服务器以及托管数据服务,以对存储的数据执行创建、读取、更新和删除操作。该解决方案完全实现了 Python DB API 2.0 规范,并作为 Windows、macOS
    的头像 发表于 01-17 12:18 843次阅读
    适用于MySQL和MariaDB的<b class='flag-5'>Python</b>连接器:可靠的MySQL数据连接器和数据<b class='flag-5'>库</b>

    适用于Oracle的Python连接器:可访问托管以及非托管的数据

    适用于 Oracle 的 Python 连接器 适用于 Oracle 的 Python 连接器是一种可靠的连接解决方案,用于从 Python 应用程序访问 Oracle 数据服务器和
    的头像 发表于 01-14 10:30 737次阅读

    数据事件触发的设置和应用

    数据无论对于生产管理还是很多的实际应用都非常重要。小编这次聊一下数据事件触发的应用。示例使用了postgresql和Python
    的头像 发表于 12-13 15:14 1016次阅读