python - 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() 的用途是什么,它会怎样让它变慢呢?
解决方案
Pandas显然实现了与 和.div
类似的除法。/
/=
分开的主要原因.div
是 Pandas 包含一个语法模型,其中对数据帧的操作由连续过滤器的应用程序描述,例如.div
,.str
等,它允许简单的连接:
ser.div(7).apply(lambda x: 'text: ' + str(x)).str.upper()
以及对多个参数的更简单支持(cfr..func(a, b, c)
不可能用二元运算符编写)。
相比之下,如果没有div
as,同样的写法是:
(ser / 7).apply(lambda x: 'text: ' + str(x)).str.upper()
该/
操作可能会更快,因为/
与.div()
.
相比之下,x /= y
运算符替换了构造x = x / y
。对于基于 NumPy 的向量化容器(如 Pandas),它有点超越:它使用就地操作而不是创建x
. 这就是为什么/=
比两者都快/
的原因.div()
。
请注意,虽然在大多数情况下这是等价的,但有时(如本例中)它可能仍需要转换为不同的数据类型,这在 Pandas 中会自动完成(但在 NumPy 中不会)。
推荐阅读
- powershell - 无法从任务计划程序中的 Powershell 命令保存日志文件
- laravel - 实时在生产中不起作用(Laravel-echo)
- c# - 排序后的筛选器/选定行无法正常工作
- php - Saving form data from a custom WooCommerce My Account tab
- sql - 在列中使用 select 的值
- puppet - 有没有办法在 Puppet Code 的案例中使用正则表达式的参数或变量
- javascript - redux saga 通道关闭后如何运行同步代码
- corda - Corda - 我们可以(再次)在生产代码中使用 NULL_PARTY 吗?
- android - 如何使用 Xml 按钮移动位图 Imageview?
- sql - 使用循环或动态查询基于字段行为求和