范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

错得离谱!竟然说pandas中的join比merge快5倍?我带你看源码吧

  前言
  最近有两位小伙伴跟我说,网上看到一篇文章说,在 python 中使用 pandas 连接两个表,别用 merge ,要使用 join,因为在大量数据的情况下 join 比 merge 要快4到5倍。
  其实这说法我一听就知道是错误的。不过当时没有具体证据支持,所以我也没有下具体结论。
  今天,我就从源码的角度,给大家一个参考依据。
  当然,本文你还会学到一些代码调试技巧,还会看到一些 pandas 的优化手段。
  join 比 merge 快很多?
  那篇文章中的测试大概如下: import pandas as pd import numpy as np from time import time  high = 1000 rows_list = [(i + 1) * 1_000_000 for i in range(10)] n_columns = 4 repeat = 5  def create_df(n_rows, n_columns, col_names):     data = np.random.randint(low=-high, high=high, size=(n_rows, n_columns))     index_col = np.arange(0, n_rows)     np.random.shuffle(index_col)     data = pd.DataFrame(data, columns=col_names, dtype=np.int16)     data["idx"] = index_col     return data for n_rows in [10_000_000]:     sum_time_merge1 = 0     sum_time_merge2 = 0      for _ in range(repeat):         df1 = create_df(n_rows, n_columns, [f"col_{i}" for i in range(n_columns)])         df2 = create_df(n_rows, n_columns, [f"Col_{i}" for i in range(n_columns)])          # merge         start = time()         df = pd.merge(df1, df2, how="left",left_on = "col_0",right_on="Col_0")         sum_time_merge1 += time() - start          ## join         start = time()         df1.set_index("idx", inplace=True)         df2.set_index("idx", inplace=True)         df = df1.join(df2)         sum_time_merge2 += time() - start      result.append([df1.shape[0], sum_time_merge1 / repeat, sum_time_merge2 / repeat])  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   ,暂时不深入
  如果你看过我之前关于类定义的文章,那么不用看里面的实现也知道,这里只不过实例化了一个对象,记录了一些相关数据而已,重要的是下方的 get result 函数
  同样道理,调试 join 函数
  咦?它的实现与 merge 不一样?别急,继续执行,直到
  进入一看,又跳回到之前 merge 函数的实现
  从左侧的调用堆栈中可以看到调用顺序:
  1 是join调用 2 是  join  compat 3 就是上图右边的代码
  你可以点击调用堆栈中的一行,代码会跳回去,就连当时执行中的所有变量的值都可以查看
  简单列一下大概的调用图:
  join 函数绕了一圈才到真正执行的地方
  所以现在我们知道,join 函数其实比 merge 函数执行更多的代码。
  但是,之前的实验数据很好地说明了 join 比 merge 快呀,为什么? 不公平的对比
  按调试流程,我们进入之前看到的 op.get result 函数里面:
  进入这个  self._get_join_info()   里面:
  可以看到许多关于 left index 和 right index 参数的判断。但是  我们使用 merge 的时候根本没有设置这两个参数,它们都是 False。
  结果就会进入这段代码:
  这是一个 python 的遍历代码,一个个去匹配 key 值
  而 join 函数执行的却是:
  直接调用行索引对象的函数
  了解这些要点,相信聪明的你也知道要这样子修改实验代码:
  把设置行索引的代码移除两个函数执行的范围外 merge 设置参数 left  index 与 right  index
  但是,结果却出乎意料!!
  对比一下之前的时间:
  解释一下差异: join 的耗时短了很多,因为现在它没有设置行索引的操作 merge 耗时也短了很多,因为现在它内部用了行索引
  但是,为什么 merge 耗时仍然比 join 要慢很多? pandas 的优化
  此时,我们把实验代码中执行 merge 和 join 的先后顺序调换一下:
  注意,记录时间的变量的对应关系没有变,所以这不会影响结果表格的左右顺序
  看看结果:
  现在,结论截然相反!
  为什么?显然,有什么东西在第二次运行的时候,得到了优化。
  在之前的源码调试中,我们得知,其实两个表按行索引关联,最核心的计算就是行索引对象的 join 函数。
  按这个原理以及之前的调试方式,可以找到一个属性。具体过程我就不再啰嗦了,直接给出验证结果:
  在 join 的过程中,有一个判断逻辑,如果行索引的值都是唯一的,那么会进行一些操作。
  直接看看它的源码
  缓存了结果。
  道理很简单,  pandas 怎么可以知道一个行索引的值是否唯一?显然要遍历一次数据。这个过程在大量数据的时候成本很高。由于索引对象是不可变的,所以可以缓存结果。
  那么,现在我们修正一下测试实验的代码,让它公平对待:
  现在的结果是:
  很多小伙伴问我怎么学习 pandas 。正如我专栏里面的思路,集中学习少数核心常用的函数和原理,你的学习之路才能事半功倍。
  不要忘记一键三连。你的点赞、收藏、关注,是我创作的动力。
  推荐文章: python为什么需要函数、类这些概念懂Excel轻松入门Python数据分析pandas(18):pandas 中的vlookuppandas每天一题-题目19:"炸列"操作的多种方式pandas新版本增强功能,数据表多列频率统计

21!霍伊别尔为球队首开纪录,热刺险胜富勒姆9月3号晚上10点,在北伦敦,热刺对阵富勒姆的比赛中,皮埃尔埃米尔霍伊别尔为球队首开纪录。热刺努力取得另一场英超胜利,以2比1险胜马尔科席尔瓦的球队。这是丹麦国脚的精彩进球,他的射绝了!湖人又要交易!看上45分先生!以前都是他们的人我该何去何从?菲律宾乔丹克拉克森,在个人社媒上抛出了这样的疑问。是的,随着爵士送走米切尔,意味着他们将彻底进入重建,队内包括克拉克森在内的老将,自然也会成为被清洗的对象。而毫不意外换手如换刀?国安主帅谢峰下课,代理主帅隋东亮率队两胜一负。继续换洋刀斯坦利佐,战绩如何还要观察。广州队主帅刘智宇下课,郑智教练团队率队征战,一胜一平一负。广州城队洋帅加斯特下课,代理主帅肇俊哲英超大冷门!曼城11战平保级队,错失登顶良机,哈兰德连场破门今天凌晨,英超联赛第6轮一场比赛结束,结果爆出了大冷门,曼城客场11战平阿斯顿维拉,连胜遭到终结,继续位列积分榜第2位。上半场双方均无建树,下半场哈兰德接德布劳内助攻破门,随后主队大神采访丨老兵峰峰特别采访水友赛篇8月27日和平精英SS19赛季特别版水友赛第三期如期进行,经过百人层层角逐最终大神峰峰成功以kda5。00场均伤害837。23的成绩拿下第一名。赛后我们有幸采访到微信区大神峰峰,和1。6亿欧,21名新援!英超升班马疯狂一夏,希腊船王开启豪购模式今年夏窗,英超升班马诺丁汉森林绝对抢了不少风头,他们虽然花费不是最高的,但是一次又一次地官宣,让外界不得不注意这支老牌球队的动态。整个夏窗,诺丁汉森林花费了1。6亿欧元,引进了2132!超级米兰德比!皮奥利换人险些自毁好局打硬仗真不能用他第304次米兰德比,基于目前意甲这样的局势,可以称之为意甲最高水平对决。相较上赛季双方牌面均有些缺失,相比国米可能缺陷较为明显一些。凯西的作用其实无人能替代,但米兰可以换个活法,虽球队超市接着开!爵士彻底摆烂仍有球员想卖湖人加入抢人大战在交易了球队全明星内线戈贝尔之后,昨日,爵士队又完成了一笔轰动联盟的大交易,他们将当家球星米切尔交易至骑士,换来了塞克斯顿马尔卡宁阿巴吉以及3个无保护首轮,2个首轮互换权。而根据记11,哈兰德端射后防失误酿悲剧,曼城遭倒数第2爆冷,无缘登顶赛前排名第2的曼城队迎来了20222023赛季英超联赛第6轮的较量,他们此役做客PK杰拉德率领的赛前排名倒数第2的维拉队。曼城在第三轮遭到纽卡阻击丢掉2分之后,最近的两轮都取得了4中超球队身价排行海港第一,广州队倒数第二,广州城让人意外今年中超夏季的转会窗口已经关闭,各个中超球队的身价也有了定论,根据权威网站德转的统计,目前上海海港是中超所有球队中身价最高的,总身价达到了3373万欧元,而河北队和广州队这2个球队5年1。8亿,愿长留金州!你和勇士互相成就,你也是库里的冲冠绝配NBA联盟30支球队,想要夺冠并非易事,金州勇士队在杜兰特离开之后,也顺理成章完成夺冠圆梦。库里克莱汤普森追梦格林和伊戈达拉,这四名球员都拥有4个总冠军,他们都是勇士队过去10年的
连心丨你们还需要些什么?人民冷暖是总书记的时刻牵挂视频加载中我向总书记汇报了农民的八个梦想。河南濮阳县西辛庄村党支部书记李连成代表回忆,从读书梦健康梦,说到就业梦环境梦我一口气汇报了六分钟。2019年全国两会上,李连成道出了农民的从美联储货币政策对我国经济发展的影响,思考人民币国际化!美元加息会导致全球资本流向美国,世界各国出现资产价格泡沫股市楼市等大宗商品出现萎靡不振的状况。出口遭遇前所未有的困境等等。美国简单的一个加息,就足以让世界各国的经济发展雪上加霜。尤狂飙看完原著才知,老默吞枪自杀背后的真相2023年一开头,一部狂飙犹如1985年的上海滩般火遍全国,高启强堪比许文强的热度。看完剧甚觉不过瘾,因删减情节,有好几个地方都无法解密,遂捧原著细细读来,才解心中疑惑。在看剧时,可以狂飙但不可以乱飙!AI换脸术到底是怎么换的?撰文白静(西安电子科技大学人工智能学院)我们先来看看换脸术!来源B站up主学弟剪辑来源B站up主流浪小屁蛋啊!我的眼睛!!B站的狂飙换脸视频层出不穷,网友表示,可以狂飙,但不可以乱2023小折叠爆款预定!FindN2Flip亮相MWC,成为欧冠官方指定用机最近的2023年世界移动通信大会(MWC2023),毫无疑问成了科技圈的大热门,不少国产厂商在会上出尽风头。比如OPPO,携多项最新创新技术成果亮相,不仅有以OPPOFindN2系维金斯神秘家庭事件恐曝光,罗斯欲做新决定,美媒爆三方交易北京时间2月27日,NBA常规赛正在如火如荼进行中,各支球队都在为季后赛席位而厮杀,经过一个月的进程,各支球队可谓几家欢喜几家愁,既有年轻球队逆流而上,也有豪门球队跌下神坛,竞技体近3000万美元订单现场发布,广州电商走全球系列活动汽车配件专场成功举办南方财经全媒体记者魏彤广州报道为全力支持广州跨境电商企业抢订单拓市场,通过参展参会发掘新需求支持企业走出去等举措帮助企业提振信心,广州市商务局谋划组织广州电商走全球系列活动。近日,2月26日晚,中国传来多个新消息,妇女节正常放假,西藏有新规定让我们花上几分钟,了解一下今天祖国传来了哪些新消息吧!无论您是处于什么样的情况,这些消息一定会让您心情愉悦。下面我们一起来看看国内传来了哪些最新消息第一个新消息,韩国从3月1日起,县队冠军梅州产新华社广州2月27日电(记者王浩明)26日晚,在广东肇庆举行的2023年中国足协青少年足球锦标赛U14决赛中,广东足协一队30战胜大连足协队,夺得冠军。让很多人意想不到的是,这支全高三女学霸,面目狰狞励志演讲,为啥引起网络一片冷嘲热讽?最近,在湖南张家界,一高三女学霸,上台发表了一段励志演讲,却遭网友冷嘲热讽。难道,广大网友真的是讽刺这小姑娘吗?我认为,其实不然,网友们并不是讽刺这名女学生本人,更多的是对她的关心物业费我该交给谁?权益怎保证?原标题四季花园一个小区两家物业(引题)物业费我该交给谁?权益怎保证?(主题)中国消费者报记者黄劼刘文新一个小区出现两家物业公司,业主不仅没有得到双份服务,还被要求交纳双份物业费,有