<分区>
我在练习vectorization with Pandas ,并且我发现了一个违反直觉的情况,当使用一系列内置向量化方法比应用一个朴素的 Python 函数(提取系列中所有数字的第一个数字)慢时:
import sys
import numpy as np
import pandas as pd
s = pd.Series(np.arange(100_000))
def first_digit(x):
return int(str(x)[0])
s.astype(np.str).str[0].astype(np.int) # 218ms "built-in"
s.apply(first_digit) # 104ms "apply"
s.map(first_digit) # 104ms "map"
np.vectorize(first_digit)(s) # 78ms "vectorized"
所有 4 个实现都产生相同的 Pandas 系列,我完全理解 vectorized
函数调用可能比每个元素 apply
/map
.
但是,我很困惑为什么使用 buil-in
方法速度较慢...虽然我也对实际答案感兴趣,但我更感兴趣的是什么是最小的我必须学习的一组工具才能评估我对性能的假设。
我的假设是方法调用链正在创建 2 个额外的中间 Pandas 系列,并且贪婪地评估这些系列的值,导致 CPU 缓存未命中(必须从 RAM 加载中间系列)。
按照该假设的步骤,我不知道如何确认或证伪:
- 中间系列/numpy 数组是贪婪还是惰性评估?
- 会不会导致 CPU 缓存未命中?
- 我还需要考虑哪些其他解释?
我的测量截图: