回答您的第一个问题:不,这不会被解释器优化。 Python 将从字符串创建一个列表,然后为切片创建第二个列表,然后将列表项重新组合成一个新字符串。
为了涵盖第二个,您可以通过使用可选的maxsplit 参数限制split 来稍微优化:
>>> v = '1.2.3.4.5-RC4'
>>> v.split(".", 3)
['1', '2', '3', '4.5-RC4']
一旦找到第三个'.',Python 就会停止搜索字符串。您还可以通过删除切片的默认 0 参数来稍微整理一下:
api = '.'.join(version.split('.', 3)[:3])
但是请注意,性能上的任何差异都可以忽略不计:
>>> import timeit
>>> def test1(version):
return '.'.join(version.split('.')[0:3])
>>> def test2(version):
return '.'.join(version.split('.', 3)[:3])
>>> timeit.timeit("test1(s)", setup="from __main__ import test1, test2; s = '1.2.3.4.5-RC4'")
1.0458565345561743
>>> timeit.timeit("test2(s)", setup="from __main__ import test1, test2; s = '1.2.3.4.5-RC4'")
1.0842980287537776
maxsplit 的好处随着包含更多不相关'.'s 的更长字符串变得更加明显:
>>> timeit.timeit("s.split('.')", setup="s='1.'*100")
3.460900054011617
>>> timeit.timeit("s.split('.', 3)", setup="s='1.'*100")
0.5287887450379003