【发布时间】:2017-12-20 03:50:51
【问题描述】:
我发现一个有趣的事情是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 返回一个三元素元组,而不是一个列表。
我想知道更多细节。
【问题讨论】:
-
是的,部分原因是构建固定长度的元组比构建任意长度的列表更有效。
-
您还使用关键字参数调用
split,即s.split('_', maxsplit=1),而不是简单的s.split('_', 1)。
标签: python string algorithm performance cpython