Python:为什么partition(sep)比split(sep, maxsplit=1)更快

2023-11-23

我发现了一个有趣的事情partitionsplit当获取分隔符后的整个子字符串时。我已经在 Python 3.5 和 3.6 (Cpython) 中进行了测试

In [1]: s = 'validate_field_name'

In [2]: s.partition('_')[-1]
Out[2]: 'field_name'

In [3]: s.split('_', maxsplit=1)[-1]
Out[3]: 'field_name'

In [4]: %timeit s.partition('_')[-1]
220 ns ± 1.12 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [5]: %timeit s.split('_', maxsplit=1)[-1]
745 ns ± 48.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [6]: %timeit s[s.find('_')+1:]
340 ns ± 1.44 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

我查看了Cpython源代码,发现了partition使用FASTSEARCH算法,参见here。还有split只使用FASTSEARCH当分隔符字符串的长度大于1时,请参见here。但我测试了 sep 字符串,哪个长度更大。我得到了同样的结果。

我想原因是partition返回一个三元素元组,而不是列表。

我想了解更多细节。


微基准可能会产生误导

py -m timeit "'validate_field_name'.split('_', maxsplit=1)[-1]"
1000000 loops, best of 3: 0.568 usec per loop

py -m timeit "'validate_field_name'.split('_', 1)[-1]"
1000000 loops, best of 3: 0.317 usec per loop

仅将参数作为位置或关键字传递就会显着改变时间。所以我猜分区更快的另一个原因是,因为它不需要第二个参数......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:为什么partition(sep)比split(sep, maxsplit=1)更快 的相关文章

随机推荐