前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Pandas、Numpy性能优化秘籍(全)

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

作者头像
算法进阶
发布于 2022-06-02 04:26:39
发布于 2022-06-02 04:26:39
3K00
代码可运行
举报
文章被收录于专栏:算法进阶算法进阶
运行总次数:0
代码可运行

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

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

1、NumExpr

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numexpr as ne

import numpy as np

a = np.linspace(0,1000,1000) 

print('# numpy十次幂计算')
%timeit a**10

print('# numexpr十次幂计算')
%timeit ne.evaluate('a**10')

2、Numba

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

如果在你的数据处理过程涉及到了大量的数值计算,那么使用numba可以大大加快代码的运行效率(一般来说,Numba 引擎在处理大量数据点 如 1 百万+ 时表现出色)。numba使用起来也很简单,因为numba内置的函数本身是个装饰器,所以只要在自己定义好的函数前面加个@nb.方法就行,简单快捷!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# pip install numba

import numba as nb

# 用numba加速的求和函数
@nb.jit()
def nb_sum(a):
    Sum = 0
    for i in range(len(a)):
        Sum += a[i]
    return Sum

# 没用numba加速的求和函数
def py_sum(a):
    Sum = 0
    for i in range(len(a)):
        Sum += a[i]
    return Sum

import numpy as np
a = np.linspace(0,1000,1000) # 创建一个长度为1000的数组
print('# python求和函数')
%timeit sum(a) 
print('# 没加速的for循环求和函数')
%timeit py_sum(a)
print('# numba加速的for循环求和函数')
%timeit nb_sum(a) 
print('# numpy求和函数')
%timeit np.sum(a) 

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from numba import cuda
cuda.select_device(1)

@cuda.jit
def CudaSquare(x):
    i, j = cuda.grid(2)
    x[i][j] *= x[i][j]


#numba的矢量化加速
from math import sin
@nb.vectorize()
def nb_vec_sin(a):
    return sin(a)

3、CuPy

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# pip install cupy
import numpy as np
import cupy as cp
import time

### 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函数,如下可以看到速度快了几十倍。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
import time
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=[]
for row in df.itertuples():
    temp=getattr(row, 'a')
    a2.append(temp*temp)
df['a2']=a2
%%timeit
a2=[]
for index,row in df.iterrows():
    temp=row['a']
    a2.append(temp*temp)
df['a2']=a2    


4.2 apply、applymap优化

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 列a、列b逐行进行某一函数计算
df['a3']=df.apply( lambda row: row['a']*row['b'],axis=1)
# 逐个元素保留两位小数
df.applymap(lambda x: "%.2f" % x)
4.3 聚合函数agg优化

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%timeit  df.groupby("x")['a'].agg(lambda x:x.sum())

%timeit  df.groupby("x")['a'].agg(sum)

%timeit  df.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 行的情况下使用会有明显优化效果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd 
nrows, ncols = 20000, 100
df1, df2, df3, df4 = [pd.DataFrame(np.random.randn(nrows, ncols)) for _ in range(4)]

print('pd')
%timeit df1 + df2 + df3 + df4
print('pd.eval')
%timeit pd.eval("df1 + df2 + df3 + df4")

5、Cython优化

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%cython
def f_plain(x):
    return x * (x - 1)
def integrate_f_plain(a, b, N):
    s = 0
    dx = (b - a) / N
    for i in range(N):
        s += f_plain(a + i * dx)
    return s * dx

6、swifter

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import swifter

df.swifter.apply(lambda x: x.sum() - x.min())

7、Modin

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install modin
import pandas
import modin.pandas as pd
import time

## 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_df for _ in range(25)])

end = time.time()
pandas_duration = end - start
print("Time to concat with pandas: {} 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_df for _ in range(25)])

end = time.time()
modin_duration = end - start
print("Time to concat with Modin: {} seconds".format(round(modin_duration, 3)))

print("Modin is {}x faster than pandas at `concat`!".format(round(pandas_duration / modin_duration, 2)))
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Kerberos基础入门
当Client想要访问Server上的某个服务时,需要先向AS证明自己的身份,然后通过AS发放的TGT向Server发起认证请求,这个过程分为三块:
Naraku
2022/02/03
1.2K0
Kerberos基础入门
Windows安全认证机制之Kerberos 域认证
Kerberos是由麻省理工学院(MIT)开发的网络身份验证协议,它的主要好处是强大的加密和单点登录(SSO)。Kerberos作为一种可信任的第三方认证服务,是通过传统的密码技术(如共享密钥)实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据的情况下保证通讯安全。
一只特立独行的兔先生
2024/01/23
9920
Windows安全认证机制之Kerberos 域认证
全网最详细 | Kerberos协议详解
Kerberos协议是由麻省理工学院提出的一种网络身份验证协议,提供了一种在开放的非安全网络中认证识别用户身份信息的方法。它旨在通过使用密钥加密技术为客户端/服务端应用程序提供强身份验证。Kerberos是西方神话中守卫地狱之门的三头犬的名字。之所以使用这个名字是因为Kerberos需要三方的共同参与才能完成一次认证流程。目前主流使用的Kerberos版本为2005年RFC4120(https://www.rfc-editor.org/rfc/rfc4120.html)标准定义的KerberosV5版本,Windows、Linux和Mac OS均支持Kerberos协议。
谢公子
2023/02/27
8.1K0
全网最详细 | Kerberos协议详解
内网渗透 | Kerberos 协议与 Kerberos 认证原理
如果你了解内网渗透,那么应该都对 IPC、黄金票据、白银票据、、PTT、PTK 这些老生常谈的词汇再熟悉不过了,对其利用也应该是了如指掌了吧。但是如果你对其背后的所使用的原理还不太了解的话,那么这篇(系列)文章你一定不能错过。
HACK学习
2021/07/21
1.9K1
Kerberos协议认证过程
Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。
Gh0st1nTheShel
2021/11/14
1.6K0
windows 认证机制
NTLM主要应用于用于Windows NT 和 Windows 2000 Server(或更高版本) 工作组环境
宸寰客
2020/10/10
1K0
windows 认证机制
Windows认证--Kerberos
Kerberos是一种由MIT(麻省理工学院)提出的一种网络身份验证协议,可通过密钥系统为客户端/服务端提供认证服务。它能够为网络中通信的双方提供严格的身份验证服务,确保通信双方身份的真实性和安全性。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全。
鸿鹄实验室
2022/11/02
1.3K0
Windows认证--Kerberos
内网渗透|Kerberos认证和黄金票据
Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。
亿人安全
2022/12/23
9460
内网渗透|Kerberos认证和黄金票据
NTLM及Kerberos认证流程
NTLM是NT LAN Manager的缩写,NTLM 是指 telnet 的一种验证身份方式,即问询/应答身份验证协议,是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容。Windows 2000内置三种基本安全协议之一。
Y5neKO
2022/01/13
1.9K0
NTLM及Kerberos认证流程
轻松理解 Kerbreos 的认证过程
前几天在给人解释 Windows 是如何通过 Kerberos 进行 Authentication 的时候,讲了半天也别把那位老兄讲明白,还差点把自己给绕进去。
信安之路
2018/08/08
1.3K0
轻松理解 Kerbreos 的认证过程
windows域环境下认证和攻击初识
Kerberos是一种认证机制。目的是通过密钥系统为客户端/服务器应用程序提供强大的可信任的第三方认证服务:保护服务器防止错误的用户使用,同时保护它的用户使用正确的服务器,即支持双向验证。kerberos最初由MIT麻省理工开发,微软从Windows 2000开始支持Kerberos认证机制,将kerberos作为域环境下的主要身份认证机制,理解kerberos是域渗透的基础。
谢公子
2022/01/20
9870
windows域环境下认证和攻击初识
一文了解黄金票据和白银票据
该攻击方式在BlackHat 2014被提出,演讲者为Alva Duckwall & Benjamin Delpy(@gentilkiwi)进行了演示,该演讲提出了Kerberos协议实现过程中的设计逻辑缺陷,也就是说Windows所有使用Kerberos的场景中都可以进行此类攻击
中龙技术
2022/09/29
9.5K0
一文了解黄金票据和白银票据
Windows安全认证是如何进行的?[Kerberos篇]
最近一段时间都在折腾安全(Security)方面的东西,比如Windows认证、非对称加密、数字证书、数字签名、TLS/SSL、WS-Security等。如果时间允许,我很乐意写一系列的文章与广大网友
蒋金楠
2018/02/07
1.6K0
Windows安全认证是如何进行的?[Kerberos篇]
一文搞定Kerberos
Kerberos 是一种身份认证协议,被广泛运用在大数据生态中,甚至可以说是大数据身份认证的事实标准。本文将详细说明 Kerberos 原理。
数据仓库践行者
2020/10/29
1.5K0
一文搞定Kerberos
Windows认证及抓密码总结
windows的认证方式主要有NTLM认证、Kerberos认证两种。同时,Windows Access Token记录着某用户的SID、组ID、Session、及权限等信息,也起到了权限认证的作用。
HACK学习
2019/08/06
1.8K0
Windows认证及抓密码总结
windows内网基础
工作组可以认为是同一网络内,功能相似的电脑进行的分组。 举个例子: “在一个网络内,可能有成百上千台电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可想而知会有多么乱。为了解决这一问题,Windows 9x/NT/2000就引用了“工作组”这个概念,将不同的电脑一般按功能分别列入不同的组中,如财务部的电脑都列入“财务部”工作组中,人事部的电脑都列入“人事部”工作组中。你要访问某个部门的资源,就在“网上邻居”里找到那个部门的工作组名,双击就可以看到那个部门的电脑了。 ” 这就是工作组,但是在工作组中的电脑还是各自管理。当其中一台计算机访问另一台计算机时还是要经过另一台计算机的认证的
ConsT27
2022/02/11
8020
windows内网基础
windows的认证方式
在本地登陆的情况下,操作系统会使用用户输入的密码作为凭据去与系统中的密码进行校验,如果成功的话表明验证通过。操作系统的密码存储在C盘的目录下:
黑白天安全
2020/04/28
2.7K0
windows的认证方式
Kerberos认证流程详解
Kerberos 是一种网络认证协议,是通过密钥系统为客户机/服务器应用程序 提供认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址 的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意的读取、 修改和插入数据。
红队蓝军
2024/07/26
8100
Kerberos认证流程详解
干货 | 全网最详细的Kerberos协议及其漏洞
krbtgt 用户,该用户是在创建域时系统自动创建的一个账号,其作用是密钥发行中心的服务账号,其密码是系统随机生成的,无法正常登陆主机。
HACK学习
2021/07/21
5.7K0
[原创]谈谈基于Kerberos的Windows Network Authentication - Part II
四、引入Ticket Granting  Service 通过上面的介绍,我们发现Kerberos实际上一个基于Ticket的认证方式。Client想要获取Server端的资源,先得通过Server的认证;而认证的先决条件是Client向Server提供从KDC获得的一个有Server的Master Key进行加密的Session Ticket(Session Key + Client Info)。可以这么说,Session Ticket是Client进入Server领域的一张门票。而这张门票必须从一个合法
蒋金楠
2018/02/07
1K1
[原创]谈谈基于Kerberos的Windows Network Authentication - Part II
相关推荐
Kerberos基础入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档