为什么pandas.dataframe.groupby在首先分配给变量时会更快?

Jon*_*451 3 python arrays optimization performance pandas

任何人都可以帮助理解为什么以下两种方式,我认为是什么,否则与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)
Run Code Online (Sandbox Code Playgroud)

somedf有7200行和24列.

我找不到,

  1. 为什么两个衬垫首先将对象分配给变量grp的
    速度要快3 倍?

  2. 如果这只是groupby方法特有的,或者对pandas甚至是python更通用的东西,例如,关于变量赋值.

非常感谢任何启发,因为这将真正有助于我想要处理的许多更大的数据帧,反复使用许多不同的参数组合.

unu*_*tbu 5

Ipython的%timeit文档声明:

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

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

%%timeit x = numpy.random.randn((100, 100))
numpy.linalg.svd(x)
Run Code Online (Sandbox Code Playgroud)

将为numpy svd例程执行时间,在设置阶段中运行x的赋值,这不是定时的.


从而,

%%timeit grp = somedf.groupby('someBoolColumn')
grp['someBoolColumn'].count()
Run Code Online (Sandbox Code Playgroud)

是时间grp['someBoolColumn'].count(),但不是任务grp = somedf.groupby('someBoolColumn').


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

要使用%%timeit两个语句计时,只需将第一行留空%%timeit:

%%timeit 
grp = somedf.groupby('someBoolColumn')
grp['someBoolColumn'].count()
Run Code Online (Sandbox Code Playgroud)

键入Enter两次完成单元格.