我很好奇为什么pandas.Series.div()在申请熊猫系列数字时比/=慢。例如:
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()的用途是什么,它会使它变得更慢吗?
发布于 2019-07-16 15:34:18
熊猫.div显然实施了类似于/和/=的部门。
有一个单独的.div的主要原因是Pandas采用了一个语法模型,其中对数据文件的操作由连续过滤器(例如.div、.str等)的应用程序来描述,这些应用程序允许简单的连接:
ser.div(7).apply(lambda x: 'text: ' + str(x)).str.upper()以及对多个参数的更简单支持(cfr )。.func(a, b, c)不可能用二进制运算符编写)。
相反,在没有div的情况下编写的代码与以下内容相同:
(ser / 7).apply(lambda x: 'text: ' + str(x)).str.upper()/操作可能更快,因为与.div()相比,与/操作符关联的Python开销更少。
相反,x /= y运算符取代构造x = x / y。对于基于NumPy (比如Pandas)的矢量化容器,它有一点超越了这一点:它使用就地操作,而不是创建x (潜在的时间和内存消耗)副本。这就是为什么/=比/和.div()都快的原因。
注意,虽然在大多数情况下这是等价的,但有时(就像本例中的情况一样),它可能仍然需要转换为不同的数据类型,这是在Pandas中自动完成的(但不是在NumPy中)。
https://stackoverflow.com/questions/57060488
复制相似问题