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

错得离谱!竟然说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新版本增强功能,数据表多列频率统计

蜂窝造型充满复古风,这款国产智能收音机,不仅只有老年人喜欢拒绝参数,只谈体验,关注导盲犬小抠,真实解读您熟悉的数码产品,本文阅读预计耗时3分钟。收音机是最传统的小家电之一,在日常生活中很常见,尤其深受中老年人的喜爱。随着科技发展,收音机的总是忍不住玩手机?用心理学的方法戒瘾,成为一个自律的人曾国藩读书时,有很大的烟瘾,到了片刻不能离烟的地步。曾国藩意识到烟瘾对自己的危害大,三十岁之前,曾国藩试着戒过两次烟,但都没有成功。曾国藩决定学做圣人,开始写日记的第二十一天又开始浅谈解放军绕台军事行动的几点想法一力度和规模前所未有,提振民族自豪感和凝聚力结合现有的资料,解放军东部战区主导的绕台军事行动,无论在军事行动区域,武器装备数量,作战方式方法上,都大大超过以往的历次演习或行动,完全从环台军演看政治家的思维差距蔡英文与佩洛西这两个政客,在本质上都是白左(崇尚政治正确的虚伪人道主义者,只是为了满足他们自己的道德优越感),思想上假大空,喜欢把没根据的理想当成现实,基本上与国际现势呈脱节状态。一个内心真正强大的女人,都有这4个好习惯,厉害看过一句话一个人内心的强大,胜过外在的浮华,会让自己走得越来越远。对于一个女人而言,外表可以柔弱或者不惊艳,但是一定要成为一个内心强大的人,真正让自己遇事不怕勇往直前,活出自己希望台独的重要心理支柱很快崩塌台独的重要支柱很快崩塌,因为中美交手的高下,越来越清楚,台独将失去其最大心理支柱指望美日的支持。此次台海危机,给我最大感觉是,要成功做一件事,最关键是切入点的正确选择。切入点选择好中国的崛起是从工业化开始的,这条成长之路到底有多坎坷(图片来源于网络)改革开放以来,中国做出的巨大改变就是从农业国蜕变成一个工业国。而这项改变也成为中国发展的重要突破。并且中国对此项改变可以说是非常成功,就现在看来,中国在工业领域上郑秀文穿吊带拼命健身,胳膊上红色纹身扎眼,锁骨事业线清晰可见近日,郑秀文在社交平台分享了一段健身视频,顺带为自己的新电影世间有她做宣传。她写道世间有她一个热爱运动和锻炼的人。视频中的她身穿着吊带运装服装,扎着头发,豆大的汗水清晰可见,一抹红于月仙去世一年,张学松曝车祸最新进展肇事者被判刑一年去年8月9日凌晨三点多,演员于月仙因车祸离世,转眼间已经过去一年的时间。可是,对于月仙的家人,以及于月仙的丈夫张学松来说,却是度日如年。8月9日上午9点整,张学松发文时间真快,一年广东省运会U15涉假比赛最新进展调查已有结果,通报时间待定北京时间8月9日,广东省运会U15决赛疑似假球事件进展如何了?昨日中国足协官宣将进行调查,并且派了工作人员前往广州,而来自博主10号沛沛的报道,两支队伍相关人员都配合足协询问,事件秋天不排毒,一年你都堵!多食3根2果2菜,润燥排毒安稳过秋秋季的气候特点就是干燥,秋燥会导致上火咳嗽喉咙痛的症状,这与体内毒素积多有关系。加之进入秋季人们的食欲也变得越来越好,稍微不注意就容易吃多了,容易在体内聚集,此时排毒就很关键。那么
黑皮魔咒?苏纳克领跑进入英相位决赛圈,民调反被特拉斯吊打英国保守党党魁选举,印度裔候选人英国前财相苏纳克以傲人的成绩一路领先进入决赛。现任外相特拉斯则在最后一轮逆袭,淘汰此前一直压在自己头顶的前防相莫当特,进入决赛。尽管英国首相之位最终佩洛西专机敢来,解放军就划禁飞区?后果可能比美国想的更严重今年11月,美国将举行中期选举,拜登所属的民主党可能丧失参众两院的控制权。随着这场重要选举逐渐临近,自导自演过一次战术阳性闹剧的美众议院议长佩洛西,又嚷嚷着要窜访台湾,使得台海局势博尔顿承认曾策划别国政变,揭开美国肮脏黑历史陶短房旅加学者7月13日,美国前总统特朗普的国家安全顾问博尔顿在接受CNN著名记者塔珀采访时脱口而出,承认在自己任职期间,美国曾策划了旨在颠覆别国政权的政变。说脱口而出,是因为博尔一个一心只想要生个儿子来传宗接代的男人到底有多疯狂这个男人太疯狂了,无数次地对他那患病的妻子实施家暴,他的所作所为真的达到了令人发指的地步。我今天就来讲讲他的故事,让大家了解一个一心只想生儿子传家接代的男人有多么令人恐怖,借此告诫女儿吃不饱,求医十年确诊罕见病,父亲想让大家都知道小胖威利头条好心人这个世界上有一群与众不同的孩子。刚出生的时候,他们体格瘦小,不会吃也不会哭。等到两三岁左右,幼时进食困难的他们却突然食欲大增,再也吃不饱饭。一直很饿,无时无刻都想要吃东西微信史诗级更新!iPhone这体验终于超越安卓了距离上个微信版本8。0。25整整过去14天时间。就在昨天下午,iOS版微信再次迎来更新。这次微信更新的版本号为8。0。26从上个版本8。0。25更新过去大概需要20MB。想到微信现7月22日中高风险地区所在县(市区)近期,国内多地出现新冠肺炎本土确诊病例和无症状感染者,防控形势严峻复杂。为切实做好疫情防控工作,保障广大市民身体健康,威海市疾病预防控制中心提醒一主动报备行程,落实防控措施1。七日明日大暑,饮食要忌嘴,少吃1瓜,多吃4菜,别不放在心上头伏已经过半,夏天最后一个节气来势汹汹大暑,这将会是一年中阳光最猛烈最炎热的节气,湿热交蒸在此时到达顶点。大暑时节阳光猛烈高温潮湿多雨,不免要出很多汗,流失大量水分。这时候的饮食要岛内中小学学生午餐加菜石斑鱼王鸿薇台军也要王鸿薇表示,中小学童营养午餐有石斑鱼,非常好。但台军也要比照,能有石斑鱼吃。(王鸿薇脸书)大陆暂停输入台湾石斑鱼后,台当局教育部门配合台农业主管部门推出学校午餐采用台产可溯源石斑鱼中亚五国举行领导人峰会,哈萨克斯坦总统托卡耶夫可邀请中俄等国高级代表参加(观察者网讯)当地时间7月21日,第四届中亚国家元首协商会议在吉尔吉斯斯坦乔尔蓬阿塔市举行。中亚五国领导人就加强区域内互动扩大合作共同应对地区安全挑战等话题交换意见,并签署多项合作曾毅我结婚时,玲花大醉,她结婚时,我大哭,孩子只差100天前言2011年,玲花和徐明朝结婚了,在她的婚礼上,曾毅大哭,随后不到半年,曾毅也结婚了,在他的婚礼上,玲花醉得不省人事,呕吐不止,3年后,两人的孩子也相继出生,中间只隔了100天。