Python:为什么分区(sep)比拆分(sep,maxsplit=1)快

Python:为什么分区(sep)比拆分(sep,maxsplit=1)快,python,string,algorithm,performance,cpython,Python,String,Algorithm,Performance,Cpython,我发现了一件有趣的事情,partition比split在分隔符后面得到整个子字符串时要快。我已经用Python3.5和3.6(Cpython)进行了测试 我查看了Cpython源代码,找到了分区使用FASTSEARCH算法,请参阅。当分隔符字符串的长度大于1时,split仅使用FASTSEARCH,请参阅。但我已经测试了长度更大的sep字符串。我得到了同样的结果 我猜原因是partition返回一个三元素元组,而不是一个列表 我想知道更多细节。微基准可能会产生误导 py -m timeit "'

我发现了一件有趣的事情,
partition
split
在分隔符后面得到整个子字符串时要快。我已经用Python3.5和3.6(Cpython)进行了测试

我查看了Cpython源代码,找到了
分区
使用
FASTSEARCH
算法,请参阅。当分隔符字符串的长度大于1时,
split
仅使用
FASTSEARCH
,请参阅。但我已经测试了长度更大的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

只需将参数作为位置或关键字传递即可显著更改时间。所以我猜另一个原因是分区更快,因为它不需要第二个参数…

是的,部分原因是构建固定长度的元组比构建任意长度的列表更有效。您还使用关键字参数调用
split
,即
s.split(“”),maxslit=1)
而不是简单的
s.split(“”,1)
。这太神奇了。我同意你说的,但我测试了一个简单的函数,它什么都不做,得到了以下结果。在[16]:def func(a,b):…:pass…:在[17]:%timeit func(1,2)95.8纳秒±1.72纳秒/循环(7次运行的平均值±标准偏差,每个10000000个循环)在[18]:%timeit func(1,b=2)123纳秒±2.3纳秒/循环(7次运行的平均值±标准偏差,每个10000000个循环)中,差异不明显。我觉得内置功能很特别。这需要一些其他的优化。
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