我习惯用C / C ++编写代码,当我看到以下数组操作时,我觉得有些CPU浪费:
version = '1.2.3.4.5-RC4' # the end can vary a lot
api = '.'.join( version.split('.')[0:3] ) # extract '1.2.3'
因此我想知道:
答案 0 :(得分:2)
出于此目的,我不知道CPU的使用情况,但这不是我们以某种方式使用高级语言的原因吗?
另一个解决方案是使用正则表达式,使用编译模式应该允许背景优化:
import re
version = '1.2.3.4.5-RC4'
pat = re.compile('^(\d+\.\d+\.\d+)')
res = re.match(version)
if res:
print res.group(1)
编辑:正如@jonrsharpe建议的那样,我也运行了timeit
基准测试。以下是我的结果:
def extract_vers(str):
res = pat.match(str)
if res:
return res.group(1)
else:
return False
>>> timeit.timeit("api1(s)", setup="from __main__ import extract_vers,api1,api2; s='1.2.3.4.5-RC4'")
1.9013631343841553
>>> timeit.timeit("api2(s)", setup="from __main__ import extract_vers,api1,api2; s='1.2.3.4.5-RC4'")
1.3482811450958252
>>> timeit.timeit("extract_vers(s)", setup="from __main__ import extract_vers,api1,api2; s='1.2.3.4.5-RC4'")
1.174590826034546
编辑:但无论如何,Python中存在一些lib,例如distutils.version
来完成这项工作。
你应该看一下answer。
答案 1 :(得分:2)
回答你的第一个问题:不,解释器不会对此进行优化。 Python将根据字符串创建一个列表,然后为切片创建第二个列表,然后将列表项重新组合成一个新的字符串。
要覆盖第二个,您可以通过使用可选的split
参数限制maxsplit
来略微优化它:
>>> 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
答案 2 :(得分:0)
对于面对python代码的C / C ++程序员来说,感觉CPU浪费是绝对正常的。你的代码:我习惯用C / C ++编写代码,当我看到以下数组操作时,我觉得有些CPU浪费:
version = '1.2.3.4.5-RC4' # the end can vary a lot
api = '.'.join(version.split('.')[0:3]) # extract '1.2.3'
在python中绝对正常,无法简化。只有 如果 ,您必须执行1000次,请考虑using a library function或write your own。