【问题标题】:Which method is faster for replacing the last occurrence of a substring in a string?哪种方法可以更快地替换字符串中最后一次出现的子字符串?
【发布时间】:2018-09-17 09:47:15
【问题描述】:

我有一个string,它是“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() 测量开始和结束之间的时间差来进行测试。
  • 您应该查看timeit 模块。如果您在 iPython 控制台中工作,请查看 %timeit 魔术命令。您可以自己回答这类问题(“哪条线路可能更快?”)。

标签: python python-3.x performance optimization


【解决方案1】:

这是一种方式:

>>> s = 'CSsomethingSCSagainCSsomething'
>>> 'SC'.join(s.rsplit('CS', 1))
CSsomethingSCSagainSCsomething

语法

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

【讨论】:

  • 它在我的替补席上击败了 OP 尝试。
  • @Jean-FrançoisFabre 另外,这只会替换最后一次出现,对吧?
  • @Adi219 但后来我把我的答案搁置了,看起来它更慢了......是的,它取代了最后一次出现。
  • @Adi219 或许你可以等待其他答案,只有在你觉得这个不错的情况下才接受。
  • @Adi219 你应该接受它。如果出现更好的,您可以接受另一个(但我对此表示怀疑!)
【解决方案2】:

在我粗略的时间里,这比 rsplit()join() 解决方案高出 20%:

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

当然,我确实依赖 Python 3.6+。

【讨论】:

  • 是的,它更快。但是对于经典的format(head=head,...),它的运行速度不会那么快。仅限 Python 3.6。不错
猜你喜欢
  • 1970-01-01
  • 2011-04-19
  • 2015-03-28
  • 2011-07-26
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多