我发现一个有趣的事情,当在分隔符后面获取整个子串时,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的源代码,找到了使用FASTSEARCH算法的partition,见here。并且split仅在分隔符字符串的长度大于1时才使用FASTSEARCH,请参见here。但是我已经在sep字符串上测试过了,它的长度更长。我得到了同样的结果。
我猜是因为partition返回了一个三元素元组,而不是一个列表。
我想知道更多细节。
发布于 2017-12-20 18:00:56
微基准测试可能会产生误导
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只需将参数作为位置或关键字传递即可显著更改时间。所以我会猜测分区更快的另一个原因,因为它不需要第二个参数…
https://stackoverflow.com/questions/47898526
复制相似问题