我在 Python 中有以下语句,其中 ori 是一个字符串
[ori[ori.rfind(' ') + 1:], ori[:ori.rfind(' ')]]
我们可以看到 ori.rfind(' ') 被调用了两次,解释器是否足够聪明,只对函数求值一次?
我们可以做以下事情:
s = ori.rfind(' ')
return [ori[s+1:], ori[:s]]
但这使用了两行。我打算在字符串列表的列表理解中使用此语句,并希望此函数是一行。
在这种情况下,解释器实际上更容易理解,因为字符串是不可变的。我的猜测是,也许口译员可以聪明地避免重新评估。一般来说,如果对象是不可变的,解释器是否足够聪明?
请您参考如下方法:
我认为您不能指望解释器只对函数求值一次,但是这里有一个等效于您当前代码的替代方法,它更短且效率与两行方法相似:
ori.rsplit(' ', 1)[::-1]
示例和时序对比:
In [1]: ori = 'foo bar baz'
In [2]: [ori[ori.rfind(' ') + 1:], ori[:ori.rfind(' ')]]
Out[2]: ['baz', 'foo bar']
In [3]: ori.rsplit(' ', 1)[::-1]
Out[3]: ['baz', 'foo bar']
In [4]: %timeit [ori[ori.rfind(' ') + 1:], ori[:ori.rfind(' ')]]
1000000 loops, best of 3: 732 ns per loop
In [5]: %timeit ori.rsplit(' ', 1)[::-1]
1000000 loops, best of 3: 514 ns per loop
In [6]: %timeit s = ori.rfind(' '); [ori[s+1:], ori[:s]]
1000000 loops, best of 3: 490 ns per loop
