游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

错得离谱!竟然说pandas中的join比merge快5倍?

  前言
  最近有两位小伙伴跟我说,网上看到一篇文章说,在python中使用pandas连接两个表,别用merge,要使用join,因为在大量数据的情况下join比merge要快4到5倍。
  其实这说法我一听就知道是错误的。不过当时没有具体证据支持,所以我也没有下具体结论。
  今天,我就从源码的角度,给大家一个参考依据。
  当然,本文你还会学到一些代码调试技巧,还会看到一些pandas的优化手段。
  join比merge快很多?
  那篇文章中的测试大概如下:importpandasaspdimportnumpyasnpfromtimeimporttimehigh1000rowslist〔(i1)1000000foriinrange(10)〕ncolumns4repeat5defcreatedf(nrows,ncolumns,colnames):datanp。random。randint(lowhigh,highhigh,size(nrows,ncolumns))indexcolnp。arange(0,nrows)np。random。shuffle(indexcol)datapd。DataFrame(data,columnscolnames,dtypenp。int16)data〔idx〕indexcolreturndatafornrowsin〔10000000〕:sumtimemerge10sumtimemerge20forinrange(repeat):df1createdf(nrows,ncolumns,〔fcol{i}foriinrange(ncolumns)〕)df2createdf(nrows,ncolumns,〔fCol{i}foriinrange(ncolumns)〕)mergestarttime()dfpd。merge(df1,df2,howleft,leftoncol0,rightonCol0)sumtimemerge1time()startjoinstarttime()df1。setindex(idx,inplaceTrue)df2。setindex(idx,inplaceTrue)dfdf1。join(df2)sumtimemerge2time()startresult。append(〔df1。shape〔0〕,sumtimemerge1repeat,sumtimemerge2repeat〕)print(pd。DataFrame(result,columns〔行数,merge耗时(秒),join耗时(秒)〕))跑一千万数据,5次,取个平均使用df。join有个前提,把2个表的关联key的列设置为行索引merge则使用普通的列作为关联key我这里生成的key是唯一的。足以复现原文的效果
  看看结果:
  嗯?还真快了这么多!
  但是为什么我一开始听到这说法,不用做任何的实验,就觉得这观点有问题?
  其实道理很简单。
  假如今天你实现了一个功能函数:
  功能很简单,把一个列表中的数值,先转成正数,然后求和
  明天,你需要实现另一个功能很接近的函数,只不过输入的不是列表,而是2个具体的数值。显然你会想着调用之前的函数:
  同样道理,join函数明显是merge函数的一个特例。pandas的设计者不会傻到用两套不一样的方式实现它们。
  但是,别人给出来的实验结果确确实实反应了它们的差异。
  接下来,我们就看看它们实现的源码。源码找答案
  首先,新建一个python文件,把代码设置得简单一些。
  打开调试窗口,点击创建python的调试配置。
  这里最重要的是设置justMyCode为false。这样子我们才能进入pandas源码里面
  接着,在merge函数那一行打开一个断点
  执行调试
  代码会停在断点的行,接着我们要点击控制菜单中的下一步(也可以用快捷键)。
  可以看到,merge函数实际调用的是pandas。core。reshape。merge。merge,暂时不深入
  如果你看过我之前关于类定义的文章,那么不用看里面的实现也知道,这里只不过实例化了一个对象,记录了一些相关数据而已,重要的是下方的getresult函数
  同样道理,调试join函数
  咦?它的实现与merge不一样?别急,继续执行,直到
  进入一看,又跳回到之前merge函数的实现
  从左侧的调用堆栈中可以看到调用顺序:
  1是join调用2是joincompat3就是上图右边的代码
  你可以点击调用堆栈中的一行,代码会跳回去,就连当时执行中的所有变量的值都可以查看
  简单列一下大概的调用图:
  join函数绕了一圈才到真正执行的地方
  所以现在我们知道,join函数其实比merge函数执行更多的代码。
  但是,之前的实验数据很好地说明了join比merge快呀,为什么?不公平的对比
  按调试流程,我们进入之前看到的op。getresult函数里面:
  进入这个self。getjoininfo()里面:
  可以看到许多关于leftindex和rightindex参数的判断。但是我们使用merge的时候根本没有设置这两个参数,它们都是False。
  结果就会进入这段代码:
  这是一个python的遍历代码,一个个去匹配key值
  而join函数执行的却是:
  直接调用行索引对象的函数
  了解这些要点,相信聪明的你也知道要这样子修改实验代码:
  把设置行索引的代码移除两个函数执行的范围外merge设置参数leftindex与rightindex
  但是,结果却出乎意料!!
  对比一下之前的时间:
  解释一下差异:join的耗时短了很多,因为现在它没有设置行索引的操作merge耗时也短了很多,因为现在它内部用了行索引
  但是,为什么merge耗时仍然比join要慢很多?pandas的优化
  此时,我们把实验代码中执行merge和join的先后顺序调换一下:
  注意,记录时间的变量的对应关系没有变,所以这不会影响结果表格的左右顺序
  看看结果:
  现在,结论截然相反!
  为什么?显然,有什么东西在第二次运行的时候,得到了优化。
  在之前的源码调试中,我们得知,其实两个表按行索引关联,最核心的计算就是行索引对象的join函数。
  按这个原理以及之前的调试方式,可以找到一个属性。具体过程我就不再啰嗦了,直接给出验证结果:
  在join的过程中,有一个判断逻辑,如果行索引的值都是唯一的,那么会进行一些操作。
  直接看看它的源码
  缓存了结果。
  道理很简单,pandas怎么可以知道一个行索引的值是否唯一?显然要遍历一次数据。这个过程在大量数据的时候成本很高。由于索引对象是不可变的,所以可以缓存结果。
  那么,现在我们修正一下测试实验的代码,让它公平对待:
  现在的结果是:
  很多小伙伴问我怎么学习pandas。正如我专栏里面的思路,集中学习少数核心常用的函数和原理,你的学习之路才能事半功倍。
  不要忘记一键三连。你的点赞、收藏、关注,是我创作的动力。
  推荐文章:python为什么需要函数、类这些概念懂Excel轻松入门Python数据分析pandas(18):pandas中的vlookuppandas每天一题题目19:炸列操作的多种方式pandas新版本增强功能,数据表多列频率统计

花西子眉笔成分花西子眉笔孕妇能用吗花西子家的这款眉笔一直都是被称为植村秀砍刀眉笔的平价替代的,花西子眉笔有三种不同的头,大家可以根据自己的化妆习惯来选择,今天小编带大家了解下花西子眉笔的主要成分吧。花西子眉笔成……阿玛尼适合夏季的口红阿玛尼什么口红适合夏季口红可是所以女生的最好的东西没有之一,阿玛尼的口红那基本上都是非常宝贵的口红,在夏季的时候我们应该用阿玛尼什么系列的口红比较好呢?下面跟着小编我们一起来了解一下吧。阿玛尼适合夏……打造科研创新平台大湾区科技创新赛道按下加速键央视网消息:作为科技部统筹推进建设的国际科技创新中心,《粤港澳大湾区发展规划纲要》正式发布四年来,各类科研基础设施平台的搭建为大湾区科技创新赛道按下加速键。在国家超级计算……黑头发可以选择什么颜色眉笔黑头发时候什么颜色眉笔在我们画眉毛的时候可以让我们选择的眉笔的颜色有非常多,那么你知道怎么选择眉笔的颜色吗?下面跟着小编我们一起来了解一下黑头发可以选择什么颜色眉笔吧。黑色的眉笔我们亚洲人本来……Win11那么好用,为什么还有人停在Windows10?2023年了,Win11都更新好几个版本了,桌面APP都玩好久了,文件管理器的标签页形式都用上了,你却还停在Win10?到底因为啥不升Win11啊,你对Win11有什么偏见,跟……花西子极细三角眉笔好用吗花西子眉笔持久度怎么样眉笔是必备的彩妆产品,选择一款好用的眉笔来勾画眉笔是很重要的,花西子极细三角眉笔是一只可以画素描的眉笔,笔尖非常细,很适合新手手残党。花西子极细三角眉笔好用吗花西子极细三……眉笔为什么有根线眉笔那线的作用很多女生在使用眉笔的时候会发现有的眉笔头上面有一根线,那么这根线的作用有什么呢?下面跟着小编我们一起来了解一下吧。眉笔为什么有根线这根线就可以把眉笔的皮削下来,这个线拉得……盖茨我想不明白停止卖给中国芯片有什么好处,国产芯片迎来风口据英国《金融时报》3月2日报道,美国富豪比尔盖茨在接受采访时表示,美国永远无法成功阻止中国拥有伟大的芯片。并称想不到停止卖给中国芯片对美国有什么好处和对中美双边关系的演变感到担……眉笔有必要买贵的吗贵的眉笔和便宜的区别眉笔是化妆必不可少的一样化妆品,市面上的眉笔价格参差不齐,很多人在挑选眉笔的时候,都很纠结,几百块和几十块的眉笔到底有什么区别。眉笔有必要买贵的吗购买化妆品的时候,应该根……自然旋律是什么牌子?自然旋律是哪个国家的什么档次关于自然旋律,这个牌子听起来就有一种莫名的好感,对于我们这种敏感肌肤来说,就是非常喜欢自然的东西,不过关于这个牌子是哪国的,有人说是韩国,有人说是国产,不妨扒一扒吧!自然旋律是……自然旋律隔离霜好用吗?自然旋律隔离霜安全吗?给大家介绍一款很实惠的隔离霜,自然旋律,这是一款修正隔离霜,有助于修正肤色,产品选用的是天然是蔬果材料,更有vc成分,可以提亮肤色,让肌肤更加白皙自然旋律隔离霜成分产品综……朵拉朵尚是正规品牌吗?朵拉朵尚是哪国的?无意中看到了朵拉朵尚这个牌子,名字之中仿佛也是透露出了一点点可爱,它们家的产品含有护肤品和彩妆等等,身边有姐妹推荐,我们先来了解一下这个牌子吧!朵拉朵尚是正规品牌吗朵拉朵……
莲藕新吃法,这招绝了,上桌就会被秒光莲藕新吃法,这招绝了,上桌就会被秒光要说起这莲藕呀,我们大家都知道营养价值很多很多,莲藕气味清香,味道微甜,脆嫩爽口,含有丰富营养成分,是通调津液之上品。莲藕味甘、涩,性……马云终于回来了,一现身就金句频出原创声明:本人原创文章,谢绝抄袭,违者必究不久前,在杭州文一路某隧道中通车时,有网友看到了一辆商务车中,有着一个熟悉的面孔,疑似2019年退出阿里巴巴的知名企业家马云。……这个人造谣说谎,我已经举报了他,诬陷广大人民群众,其心可诛首先他满口谎言,谎话连篇,中国人民,没有他说的那么不堪,我们的人民是最老实,最勤劳的人。来自网络谎话连篇其二,就是造谣诬陷广大人民群众,用其阴暗的心理猜测,来揣摩纯……裸妆怎么化好看化裸妆的正确步骤关键一:底妆要够持久,脱妆就会穿帮!关键二:遮瑕慢慢叠,逐一修掉脸上瑕疵。关键三:嘴唇透出自然血色感。关键四:眼影用雾面大地色若有似无最迷人。裸妆怎么化好看关键一:底妆要……bloomy化妆刷怎么样?bloomy化妆刷好用吗bloomy化妆刷就是我们常说的老爷化妆刷,它家刷子可以说是美貌和内在皆具,外貌控一定不要错过。下面一起和5号网小编来了解一下吧!bloomy化妆刷怎么样不知不觉收了很多……中国游客来到这个南太平洋岛国,都惊呆了这里女人怎么那么胖?这里是刘小顺的旅行和生活研究所。说到努库阿洛法这个地名,恐怕绝大多数朋友应该跟我一样,刚开始都一头雾水,不知道这是个什么地方。其实,努库阿洛法是一个南太平洋国家的首……爱马仕蓝色橘彩星光香水专柜价格爱马仕橘彩星光价格hermes爱马仕是很多人都非常喜欢的一个奢侈品品牌,爱马仕的包包一直被很多女性朋友所爱,爱马仕蓝色橘彩星光香水也是很火的一款产品,颜值非常的高,深受大家的欢迎与喜爱。爱马仕蓝……摇一摇终于被整治寻找数码点评派如果光说手机硬件的话,这三四年以来的变化,确实是太大了。就单拿性能出来说吧,机哥还记得19年发布的骁龙855,安兔兔跑分还只有35万。要是机哥现……赫拉hera樱花气垫怎么样?赫拉hera樱花气垫好用吗?赫拉hera樱花气垫限量版是2016最新的款式,随时补妆均匀肤色,改善细纹嫩白透亮。那么赫拉hera樱花气垫怎么样?赫拉hera樱花气垫好用吗?赫拉hera樱花气垫怎么样……赫拉hera樱花气垫用完要卸妆吗?赫拉樱花气垫的功效与作用赫拉hera樱花气垫有效改善皮肤暗沉,隔离紫外线侵害,妆感更自然柔和。那么赫拉hera樱花气垫用完要卸妆吗?赫拉樱花气垫的功效与作用有哪些?赫拉樱花气垫用完要卸妆吗……Gucci2017夏季限定腮红色号Gucci2017夏季限定Gucci今年夏季推出了一款限定版的腮红,这款腮红印有七星瓢虫的大logo,非常的有意思!今天5号网小编就要为大家介绍一下,Gucci2017夏季限定腮红色号怎么选择?Gucc……thesaem得鲜口红多少钱?韩国thesaem得鲜口红价格thesaem得鲜口红色泽饱满丰盈双唇,轻便设计一按即出,锁住唇部水分不粘杯。那么thesaem得鲜口红多少钱?韩国thesaem得鲜口红价格是多少钱?thesaem得鲜……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网