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

时间:2017-12-20 03:50:51

标签: python string algorithm performance cpython

我发现一个有趣的事情是partition比分隔符后面的整个子字符串更快split。我已经在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算法,请参阅heresplit仅在分隔符字符串的长度大于1时使用FASTSEARCH,请参阅here。但我已经测试了长度较大的sep字符串。我得到了同样的结果。

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

我想了解更多细节。

1 个答案:

答案 0 :(得分:2)

微量标记可能会产生误导

Enum

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