替换字符串中最后一个子字符串,哪种方法更快?

3

我有一个由"S"和"C"组成的字符串。
这个字符串至少包含一个"S"和一个"C"。

我想找到最后一次出现的"CS",并将其改为"SC"。

目前我有两种方法:

P = P[::-1].replace("SC", "CS", 1)[::-1]

并且

P = P[:P.rfind("CS")] + "SC" + P[P.rfind("CS") + 2:]

哪一行可能更快?还有,有没有更快的方法来完成我正在做的事情?

你可以通过多次运行这两个函数并使用time.time()测量开始和结束之间的时间差来进行测试。 - Nathan
1
你应该研究一下timeit模块。如果你正在使用iPython控制台,可以尝试使用%timeit命令来进行测试。这样你就可以自己回答这种问题(“哪一行代码更快?”)。 - Rory Daulton
2个回答

8
这是一种方法:
>>> s = 'CSsomethingSCSagainCSsomething'
>>> 'SC'.join(s.rsplit('CS', 1))
CSsomethingSCSagainSCsomething

语法:

new_substring.join(str.rsplit(old_substring, occurance))

它在我的测试中击败了 OP 的尝试。 - Jean-François Fabre
1
@Adi219 如果可能的话,你可以等待其他答案,并且只有在你觉得这个答案好的时候才接受它。 - Austin
1
@Adi219,你应该接受它。如果有更好的选择出现,你可以接受另一个(但我怀疑会有更好的!) - Jean-François Fabre
(使用 methodcaller('rsplit', 'CS', 1)(s) 比直接使用 s.rsplit('CS', 1) 稍微慢一些。) - chepner
@chepner 您说得对,我将重复执行此操作多次(每次使用不同的字符串)。请您详细说明您的观点(两个方面都要),因为我还没有完全理解。 - Adi219
显示剩余10条评论

2

在我简单的计时中,这个方法比使用rsplit()join()的解决方案快20%:

head, _, tail = string.rpartition('CS')
new_string = f"{head}SC{tail}"

当然,这取决于Python 3.6+。


是的,它更快。但是对于经典的 format(head=head,...) ,它的速度不够快。仅适用于Python 3.6。好的。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接