我正在使用pandas向量化的str.split()方法来提取在“~”分割后返回的第一个元素。我还尝试使用df.apply()与lambda和str.split()来产生等效结果。但是使用%timeit时,我发现df.apply()的性能比向量化版本更快。
我阅读过关于向量化的所有内容似乎都表明第一个版本应该具有更好的性能。请问有人可以解释一下为什么会出现这种情况吗?示例:
id facility
0 3466 abc~24353
1 4853 facility1~3.4.5.6
2 4582 53434_Facility~34432~cde
3 9972 facility2~FACILITY2~343
4 2356 Test~23 ~FAC1
上述数据框大约有500,000行,我也测试了大约1,000,000行,结果类似。以下是一些示例输入和输出:
向量化
In [1]: %timeit df['facility'] = df['facility'].str.split('~').str[0]
1.1 s ± 54.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Lambda Apply
In [2]: %timeit df['facility'] = df['facility'].astype(str).apply(lambda facility: facility.split('~')[0])
650 ms ± 52.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
有人知道我为什么会遇到这种情况吗?
谢谢!
str.split
是矢量化的?在Pandas / Numpy中,矢量化通常意味着连续的内存块。df['facility']
是object
类型的,这只是一堆指针。 - jpp