我发现一个有趣的事情是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
算法,请参阅here。 split
仅在分隔符字符串的长度大于1时使用FASTSEARCH
,请参阅here。但我已经测试了长度较大的sep字符串。我得到了同样的结果。
我猜原因是partition
返回一个三元素元组,而不是一个列表。
我想了解更多细节。
答案 0 :(得分:2)
微量标记可能会产生误导
Enum
将参数作为位置或关键字传递会显着改变时间。所以我猜其他原因分区更快,因为它不需要第二个参数......