首页 > 解决方案 > pandas.Series.div() 与 /=

问题描述

我很好奇为什么 pandas.Series.div() 在应用于 pandas 系列数字时比 /= 慢。例如:

python3 -m timeit -s 'import pandas as pd; ser = pd.Series(list(range(99999)))' 'ser /= 7'
1000 loops, best of 3: 584 usec per loop

python3 -m timeit -s 'import pandas as pd; ser = pd.Series(list(range(99999)))' 'ser.div(7)'
1000 loops, best of 3: 746 usec per loop

我认为这是因为前者更改了系列,而后者返回了一个新系列。但如果是这样的话,如果 div() 和 mul() 不如 /= 和 */ 快,为什么还要费心去实现它们呢?即使您不想就地更改系列,ser / 7 仍然比 .div() 快:

python3 -m timeit -s 'import pandas as pd; ser = pd.Series(list(range(99999)))' 'ser / 7'
1000 loops, best of 3: 656 usec per loop

那么 pd.Series.div() 的用途是什么,它会怎样让它变慢呢?

标签: pythonpandasperformance

解决方案


Pandas显然实现了与 和.div类似的除法。//=

分开的主要原因.div是 Pandas 包含一个语法模型,其中对数据帧的操作由连续过滤器的应用程序描述,例如.div,.str等,它允许简单的连接:

ser.div(7).apply(lambda x: 'text: ' + str(x)).str.upper()

以及对多个参数的更简单支持(cfr..func(a, b, c)不可能用二元运算符编写)。

相比之下,如果没有divas,同样的写法是:

(ser / 7).apply(lambda x: 'text: ' + str(x)).str.upper()

/操作可能会更快,因为/.div().

相比之下,x /= y运算符替换了构造x = x / y。对于基于 NumPy 的向量化容器(如 Pandas),它有点超越:它使用就地操作而不是创建x. 这就是为什么/=比两者都快/的原因.div()

请注意,虽然在大多数情况下这是等价的,但有时(如本例中)它可能仍需要转换为不同的数据类型,这在 Pandas 中会自动完成(但在 NumPy 中不会)。


推荐阅读