【问题标题】:Why is pandas.dataframe.groupby faster when assigned to variable first?为什么首先分配给变量时 pandas.dataframe.groupby 更快?
【发布时间】:2017-11-26 16:50:51
【问题描述】:

任何人都可以帮助理解为什么以下两种方法,我的想法是,否则与 pandas.dataframe groupby 方法相同,根据 iPython 的 Magic % 在不同的时间完成时间?

%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 更通用的东西,例如,关于 变量赋值。

非常感谢您的启发,因为这确实有助于处理我想要处理的许多更大的数据帧,重复使用许多不同的参数组合。

【问题讨论】:

标签: python arrays performance pandas optimization


【解决方案1】:

Ipython 的%timeit docs 状态:

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

(我的重点)。 cell mode 是通过使用%%timeit 的双百分比形式触发的。 当您在 IPython 提示符下键入 %magic 时,IPython 打印的文档中还有一个简介:

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

将计时 numpy svd 例程的执行,运行 x 的赋值 作为设置阶段的一部分,没有计时。


因此,

%%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。确认:
    %timeit grp = somedf.groupby('someBoolColumn'); grp['someBoolColumn'].count() 482 µs ± 7.69 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  • 再次感谢@ubuntu 的细微而重要的区别。遗憾的是,我现在无法编辑该问题以使其对其他人更有用,因为它假定 %timeit 不是焦点,而您已经表明它是焦点。如果您可以添加诸如“如何在没有设置线或某种虚拟设置线的情况下使用单元模式”之类的内容,那么我认为这将对我和其他人有所帮助,并且非常感谢。如果没有,那么已经非常感谢了。谢谢。
  • 哦,我仍然可以编辑问题。在问题之后,我添加了“A:iPython %timeit misuse”。希望尽可能清晰和快速地使其更易于搜索和有用。请让我知道这是否违反 StackOverflow 礼仪,因为这是我提出的第一个问题。
  • @JonB451:感谢您思考如何让您的问题对其他人最有用。你的问题的两个版本都很好。就个人而言,我喜欢以“原始”形式留下的问题——即使它包含错误——只要问题是明确的。毕竟,搜索者很少以绝对最佳的方式提问,因为这样做需要已经知道答案。把问题留在错误的形式是好的,因为它可以最大限度地帮助有同样误解的其他人。
猜你喜欢
  • 1970-01-01
  • 2016-02-10
  • 2022-10-05
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多