【问题标题】:Pop a substring from end of string efficiently有效地从字符串末尾弹出一个子字符串
【发布时间】:2019-09-26 14:57:05
【问题描述】:

假设我有一个长度为nbig_string,我想从其末尾删除一个长度为k 的子字符串

我们可以使用big_string[:-k],但这将是O(n-k),我们可以做得比这更好吗,比如inO(k)

【问题讨论】:

  • big_string[:-k] 不是O(n-k),是什么让你这么认为?它本质上是一个常量操作(O(1))——要么“在这个内存地址写一个空终止符”,要么“将定义数量的内存从一个地方复制到另一个地方并更新一个指针”或其他一些只执行一次的东西,无论nk 的值如何。
  • 列表切片是在 python 中执行此操作的惯用方式,你真的找不到更有效的方法(或者如果你找到了,它会非常丑陋且非 pythonic)。如果您正在寻找原始速度,请使用 C 或其他东西。

标签: python string slice


【解决方案1】:

如果您的字符串是 py2 unicode 或 py3 str,则 @MyNameIsCaleb 所指的 memoryview 想法将不起作用,切片确实会复制,即 O(n)。

对于可变类型 (del m[-k:]),修剪结尾很快,但只有字符串类型(不可变)支持字符串操作,如 find()in 和正则表达式。

如果修剪结尾是一个非常频繁的操作,并且很少使用字符串操作或者可以限制到字符串的一小部分,那么将字符串转换为字符列表一次可能是值得的:

chars = [c for c in big_string]

要对有界部分使用字符串操作,您可以将切片转换为字符串。例如,要确定 'foo' 是否出现在最后 1000 个字符中:

'foo' in ''.join(chars[-1000:])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2010-11-05
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多