我熟悉"矢量化"的概念,以及熊猫如何使用矢量化技术来加速计算.矢量化函数在整个系列或DataFrame上广播操作,以实现比传统迭代数据更大的加速.
但是,我很惊讶地看到很多代码(包括Stack Overflow的答案)提供了解决问题的方法,这些问题涉及使用for循环和列表推导来循环数据.阅读完文档后,对API有了不错的理解,我认为循环是"坏的",并且应该"永远"迭代数组,系列或DataFrame.那么,为什么我会不时地看到用户提出循环解决方案呢?
因此,要总结......我的问题是:
是否for循环真正的"坏"?如果不是,在什么情况下它们会比使用更传统的"矢量化"方法更好?1
1 - 虽然这个问题确实听起来有点宽泛,但事实是,当for循环通常比传统的迭代数据更好时,存在非常具体的情况.这篇文章旨在为后人捕捉这一点.
这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.
我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply很慢",应该避免".
我已经阅读了很多关于性能主题的文章,解释apply很慢.我还在文档中看到了一个关于如何apply简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply如果可能,应该避免.但是,这引发了以下问题:
apply是如此糟糕,那为什么它在API中呢?apply- 免费?apply是不错的(比其他可能的解决方案更好)?apply在大多数情况下,似乎可以加速数据帧的操作过程.但是当我使用时,apply我没有找到加速.这是我的例子,我有一个包含两列的数据框
>>>df
index col1 col2
1 10 20
2 20 30
3 30 40
Run Code Online (Sandbox Code Playgroud)
我想要做的就是通过实施函数来计算值,每一行数据帧R(x)上col1,结果将由值划分col2.例如,第一行的结果应该是R(10)/20.所以这是我的函数,它将被调用apply
def _f(input):
return R(input['col1'])/input['col2']
Run Code Online (Sandbox Code Playgroud)
然后我打电话_f的apply:df.apply(_f, axis=1)
但我发现在这种情况下,apply比循环要慢得多
for i in list(df.index)
new_df.loc[i] = R(df.loc[i,'col1'])/df.loc[i,'col2']
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释原因吗?