Pandas apply 与 np.vectorize 的性能比较
据观察,np.vectorize() 可以明显快于 df。基于 Pandas DataFrame 中的现有列创建新列时使用 apply() 。观察到的性能差异源于这两种方法所采用的底层机制。
df.apply() 与 Python 级循环
df.apply() 本质上创建迭代 DataFrame 的每一行的 Python 级循环。正如提供的基准测试中所演示的,与真正的向量化计算相比,Python 级循环(例如列表推导式和映射)都相对较慢。
np.vectorize() vs df.apply()
np.vectorize() 将用户定义函数转换为通用函数 (ufunc)。 Ufunc 经过高度优化,可以利用基于 C 的代码和优化算法对 NumPy 数组执行逐元素操作。这与 df.apply() 形成对比,df.apply() 对 Pandas Series 对象进行操作并产生额外的开销。
真正的矢量化:最佳性能
真正高效的列创建,强烈建议在 NumPy 中进行矢量化计算。 numpy.where 等操作以及使用 df["A"] / df["B"] 进行直接逐元素除法的速度非常快,并且避免了与循环相关的开销。
Numba 优化
为了提高效率,可以使用 Numba 进一步优化循环,Numba 是一种将 Python 函数转换为优化的 C 代码的编译器。 Numba 可以将执行时间减少到微秒,显着优于 df.apply() 和 np.vectorize()。
结论
虽然 np.vectorize() 可能提供对 df.apply() 进行了一些改进,它并不是 NumPy 中矢量化计算的真正替代品。为了实现最大性能,请利用 Numba 优化或 NumPy 中的直接矢量化操作在 Pandas DataFrames 中创建新列。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3