为什么 pandas.dataframe.groupby 在先赋值给变量后速度更快?

3

请问有人能帮助我理解为什么使用 pandas.dataframe groupby 方法 进行以下两种操作,看起来本应该是相同的,但根据 iPython 的 Magic %timeit,会导致如此不同的时间?

%timeit somedf.groupby('someBoolColumn')['someBoolColumn'].count()
484 µs ± 9.52 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit grp = somedf.groupby('someBoolColumn')
grp['someBoolColumn'].count()
146 µs ± 1.47 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

somedf有7200行24列。

我找不到:

  1. 为什么将对象分配给变量grp的两行代码要比其他方式快3倍以上,

  2. 这是仅限于groupby方法还是与pandas甚至Python更普遍的变量分配相关,例如。

非常感谢您提供任何启示,因为这将真正有助于处理许多更大的数据框,我需要进行多种不同参数的重复处理。


嘿Jon,你已经进行了这个编辑,你问了一下除了编辑答案之外还能做什么:不能评论的限制是有原因的,在这里你可以阅读为什么存在这些限制以及你可以做些什么替代方案。祝你有美好的一天! - jmattheis
1个回答

5

Ipython的%timeit文档说明:

在单元格模式下,第一行语句用作设置代码(执行但不计时),单元格的主体计时。单元格主体可以访问在设置代码中创建的任何变量。

(我强调了这点)。使用%%timeit的双百分号形式会触发cell mode。当您在IPython提示符下键入%magic时,IPython还会打印一段文本:

%%timeit x = numpy.random.randn((100, 100))
numpy.linalg.svd(x)

will time the execution of the numpy svd routine, running the assignment of x as part of the setup phase, which is not timed.


因此,

%%timeit grp = somedf.groupby('someBoolColumn')
grp['someBoolColumn'].count()

在计时时,只有 grp['someBoolColumn'].count() 被计时,而不是赋值语句 grp = somedf.groupby('someBoolColumn')

如何在没有设置行的情况下使用%%timeit:

要使用%%timeit计时两个语句,只需在%%timeit之后留空第一行即可:

%%timeit 
grp = somedf.groupby('someBoolColumn')
grp['someBoolColumn'].count()

通过输入 Enter 两次来完成单元格。


感谢@unutbu。确认:<br/> %timeit grp = somedf.groupby('someBoolColumn'); grp['someBoolColumn'].count() 482 µs ± 7.69 µs每个循环(平均值±7次运行的标准差,每个1000个循环) - JonB451
再次感谢@ubuntu指出微妙而重要的区别。遗憾的是,我现在无法编辑问题以使其对其他人更有用,因为它假定%timeit不是重点,而您已经证明它是。如果您可以添加任何内容,例如“如何在没有设置行或某种虚拟设置行的情况下使用单元格模式”,那么我认为这对我和其他人都会很有帮助,并且非常感激。如果不能,那么已经非常感激了。谢谢。 - JonB451
哦,我仍然可以编辑问题。在问题后面,我添加了“A:iPython%timeit误用。”,希望使其更易于搜索和快速使用。如果这违反了StackOverflow的礼仪,请告诉我,因为这是我提出的第一个问题。 - JonB451
1
@JonB451:感谢您考虑如何使您的问题对他人最有用。您的两个版本的问题都很好。就我个人而言,我更喜欢问题以其“原始”形式留下 - 即使包含错误 - 只要问题是清晰的。毕竟,搜索者很少以绝对最佳方式提出问题,因为这样做需要已经知道答案。将问题保留在其错误的形式中很好,因为它最大化了帮助其他具有相同误解的人的机会。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接