Pandas字符串操作的各种方法速度测试

news2025/2/24 9:13:48

由于LLM的发展, 很多的数据集都是以DF的形式发布的,所以通过Pandas操作字符串的要求变得越来越高了,所以本文将对字符串操作方法进行基准测试,看看它们是如何影响pandas的性能的。因为一旦Pandas在处理数据时超过一定限制,它们的行为就会很奇怪。

我们用Faker创建了一个100,000行的测试数据。

测试方法

安装:

 !pip install faker

生成测试数据的方法很简答:

 import pandas as pd
 import numpy as np
 
 def gen_data(x):
   from faker import Faker
   fake = Faker()
   outdata = {}
   for i in range(0,x):
     outdata[i] = fake.profile()
   return pd.DataFrame(outdata).T
 
 n= 100000
 basedata = gen_data(n)

然后把Google Colab将输出存储在Google drive中

 from google.colab import drive
 drive.mount('/content/drive')

创建了非常简单的函数来测试连接两个字符串的各种方法。

 def process(a,b):
   return ''.join([a,b])
 
 def process(a,b):
   return a+b
 
 def process(a,b):
   return f"{a}{b}"
 
 def process(a,b):
   return f"{a}{b}"*100

创建一个空DF,编写一个函数将输出%%timeit作为一行添加到数据框中

 # add a row to the dataframe using %%timeit output
 def add_to_df(n, m, x, outputdf):
   outputdf.loc[len(outputdf.index)] = [m, n, x]
 
 # output frame
 outputdf = pd.DataFrame(columns=['method', 'n', 'timing'])
 outputdf

然后就是运行上面的每个函数并将数据导出到pandas的代码。

 # get a sample of data
 n = 10000
 suffix = 'fstring_100x'
 data = basedata.copy().sample(n).reset_index()

记录运行时间

 %%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row in range(len(data)):
   data.at[row ,'newcol'] = process(data.at[row, 'job'], data.at[row, 'company'])
 
 # 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
 # <TimeitResult : 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>

完整的函数调用

 m = "Iterating over the rows"
 add_to_df(n = n, m = m, x = vars(_), outputdf = outputdf)

试验

上面是代码,下面开始用上面的代码进行试验:

Iterrows (pandas原生函数)每行相加

 %%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row, item in data.iterrows():
   data.at[row ,'newcol'] = process(item['job'], item['company'])

Itertuples(由于不可变而更安全)每行相加

 %%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row, job, company in data[['job','company']].itertuples():
   data.at[row ,'newcol'] = process(job, company)

使用pandas原生函数作为字符串相加

 %%timeit -r 7 -n 1 -o
 data['newcol'] = data.job + data.company

使用原生函数pandas. series .add

 %%timeit -r 7 -n 1 -o
 data['newcol'] = data.job.add(data.company)

使用dataframe.apply

 %%timeit -r 7 -n 1 -o
 data['newcol'] = data.apply(lambda row: process(row['job'],row['company']), axis=1)

使用List Map

 %%timeit -r 7 -n 1 -o
 data['newcol'] = list(map(process, data.job, data.company))

Pandas矢量化

 %%timeit -r 7 -n 1 -o
 data['newcol'] = process(data.job, data.company)

numpy数组矢量化

 %%timeit -r 7 -n 1 -o
 data['newcol'] = process(data.job.to_numpy(), data.company.to_numpy())

显式在numpy数组上使用numpy向量化

 %%timeit -r 7 -n 1 -o
 data['newcol'] = np.vectorize(process)(data.job.to_numpy(), data.company.to_numpy())

优化后的列表推导式

 %%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 data['newcol'] =[process(i,j) for i,j in list(zip(data.job, data.company)) ]

最后是结果的输出:

 outputdf.to_csv(f"./drive/MyDrive/{n}_{suffix}.csv")

结果

结果如下所示。我用了上面3种不同函数测试了结果。

原生的字符串加法C = a+b

从1000行扩展到100,000行所需的时间;

可视化对比:

所有矢量化方法都非常快,而且pandas标准的str.add对numpy数组也进行了矢量化。能够看到Pandas的原生方法一般都是线性的。List-map似乎以N的平方根的速度增长

使用fstring: c = f " {a}{b} "

使用fstring,结果很有趣,有的结果无法解释。

时间

可视化

从时间上看,长度超过10,000的DF时,向量化是正确执行的

下图是第三个函数,就是*100,这更能说明问题,向量化操作的基本上时间没有变化

总结

通过上面的测试,我们可以总结一下结果:

1、还是老生常谈的问题,不要使用iterrows(), itertuples(),尽量不要使用DataFrame.apply(),因为几个函数还是循环遍历的。

2、矢量化操作在字符串操作中也是可以使用的,但是为了安全起见,使用Numpy数组。

3、列表推导式就像它的名字一样,它还是一个list

4、还有一些奇怪的无法解释的问题,但是大部分的情况都是可以解释的

https://avoid.overfit.cn/post/2633908f89b14e0bb14bcaab443c3fec
如果你有更好的理解,欢迎留言

作者:Dr. Mandar Karhade

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/916412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kali 分析和管理网络

查看网络 ifconfig 命令 ┌──(root㉿kali)-[~] # eth0:有线网卡 └─# ifconfig eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.56.128 netmask 255.255.255.0 broadcast 192.168.56.255inet6 fe80::20c:29ff:feb3:7991 prefixlen 64 …

DataFrame.plot函数详解(一)

DataFrame.plot函数详解&#xff08;一&#xff09; 1.函数定义 使用pandas.DataFrame的plot方法绘制图像会按照数据的每一列绘制一条曲线&#xff0c;默认按照列columns的名称在适当的位置展示图例 。 DataFrame.plot(xNone, yNone, kindline, axNone, subplotsFalse, shar…

什么是XGBoost

什么是XGBoost XGBoost是GBDT的优秀版本。XGBoost的整体结构和GBDT一致&#xff0c;都是在训练出一棵树的基础上&#xff0c;再训练下一棵树&#xff0c;预测它与真实分布间的差距&#xff0c;通过不断训练用来弥补差距的树&#xff0c;最终用树的组合实现对真实分布的模拟。 …

怎么把AVI视频转GIF动图?教你几种简单好用方法

将视频转成GIF动图有很多好处。首先&#xff0c;GIF动图可以自动循环播放&#xff0c;这使得它们更易于分享和观看。相比于视频&#xff0c;GIF动图的体积更小&#xff0c;加载速度更快&#xff0c;更利于在社交媒体等平台上分享。此外&#xff0c;GIF动图还可以作为一种有趣的…

【地理图库】世界小麦产量分布

声明&#xff1a;来源网络&#xff0c;仅供学习&#xff01;

Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…

气传导蓝牙耳机哪款好?推荐几款很不错的气传导耳机

​气传导耳机在音质、舒适度和耐久性方面的表现相当出色&#xff0c;能够满足你的各种需求。然而面对市面上这么多气传导耳机&#xff0c;不知道该如何挑选时&#xff0c;也不用过于担心&#xff0c;我先来安利几款很不错的气传导耳机给大家来参考参考&#xff0c;看看有没有心…

Redis过期数据的删除策略

1 介绍 Redis 是一个kv型数据库&#xff0c;我们所有的数据都是存放在内存中的&#xff0c;但是内存是有大小限制的&#xff0c;不可能无限制的增量。 想要把不需要的数据清理掉&#xff0c;一种办法是直接删除&#xff0c;这个咱们前面章节有详细说过&#xff1b;另外一种就是…

冠达管理:水产、食品检测概念股强势拉升 日本将启动福岛核污染水排海

受日本将发动福岛核污染水排海事情刺激&#xff0c;水产股23日盘中大幅拉升&#xff0c;截至发稿&#xff0c;大湖股份涨停&#xff0c;国联水产涨超6%&#xff0c;獐子岛、百洋股份涨超3%。 核污染防治概念亦走强&#xff0c;截至发稿&#xff0c;中电环保涨超11%&#xff0c;…

删除链表的中间节点

题目&#xff1a; 示例&#xff1a; 思路&#xff1a; 这个题类似于寻找链表中间的数字&#xff0c;slow和fast都指向head&#xff0c;slow走一步&#xff0c;fast走两步&#xff0c;也许你会有疑问&#xff0c;节点数的奇偶不考虑吗&#xff1f;while执行条件写成fast&&…

重磅GPT-3.5 Turbo开放微调功能,专属GPT来了

8月22日&#xff0c;OpenAI官网发布最新公告&#xff1a;GPT-3.5 Turbo 的微调现已推出&#xff0c;GPT-4 的微调将于今年秋天推出。 此更新使开发人员能够自定义更适合其自身的模型&#xff0c;并大规模运行这些自定义模型。早期测试表明&#xff0c;GPT-3.5 Turbo 的微调版本…

flask获取请求对象的get和post参数

前言 get请求参数是在URL里面的&#xff0c;post请求参数是放在请求头里面的 get请求&#xff1a; index_page.route("/get") def get():var_a request.args.get("a", "jarvis")return "request:%s,params:%s,var_a:%s" %(request…

生态经济学领域里的R语言机器学(数据的收集与清洗、综合建模评价、数据的分析与可视化、数据的空间效应、因果推断等)

近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c;目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…

前端界面设计

目录 1.设计一个兴趣展示网站1.效果2.代码展示 2.设计一个优美的登录网页1.效果2.代码展示 3. 自己写过的一些前端界面设计Demo整理。 1.设计一个兴趣展示网站 1.效果 2.代码展示 工程截图&#xff1a; index.html代码&#xff1a; <!DOCTYPE html> <html lang"…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 6 Data Transfers标签页介绍

这篇文章我们介绍下Data Transfers页的配置,这里边包含的内容是IRV,我之前的文章里有讲解过IRV就是 Inter-Runnable Variables,内部runnable的之间传递数据的变量,在讲解Data Store memory的文章里我们提到了,irv也可以使用Data Store memory的方式来实现,我们先看下IRV如何…

OceanBase:谁动了我得参数?

作者&#xff1a;郑增权 爱可生南区数据库工程师&#xff0c;爱可生 DBA 团队成员&#xff0c;负责数据库相关技术支持。爱好&#xff1a;桌球、羽毛球、咖啡、电影。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:3.3->4.3

目录 3.3 Visibility Tag 左边的发射器&#xff1a; 发射器更新 粒子生成 粒子更新 右边的发射器 和左边发射器不同的地方 3.4 Texture Sampling 发射器更新 粒子生成 粒子更新 4.1Play Audio Per Particle 系统 第三个发射器 发射器更新 粒子生成 粒子更新 第二个…

C++ 好用的格式化库--fmt

背景 fmt 库是一个开源的 C 格式化库&#xff0c;它提供了一种简洁、安全和高效的方式来进行字符串格式化。该库的设计目标是提供与 Python 的字符串格式化语法类似的功能&#xff0c;同时保持 C 的类型安全性和性能。 下载与安装 官网下载 fmt 官网地址&#xff1a;https:…

OpenEuler 卸载mysql

查询系统是否安装了MySQL rpm -qa | grep -i mysql 关闭mysql 查看MySQL服务运行状态 ps -ef | grep mysql 或者 service mysql status 没有启动 查看rpm包安装的mysql rpm -qa | grep -i mysql 将这些都卸载了 rpm -e mysql5-server rpm -e mysql5-errmsg rpm -e my…

4G WiFi LoRa无线外夹式超声波管道流量计MQTT/http协议 json数据说明

ip&#xff1a;114.128.112.131 port&#xff1a;1883 uname&#xff1a;scwl_flowmeter pwd&#xff1a;b123 topic&#xff1a;iot/data/scwlflowmeter { “deviceId”:“设备序列号”, “flow”:“瞬时流量&#xff08;浮点数&#xff09;”, “heatFlow”:“瞬时热流量&am…