【问题标题】:Python3.x: quickest way to replace characters in very large stringPython3.x:在非常大的字符串中替换字符的最快方法
【发布时间】:2017-06-25 03:08:26
【问题描述】:

假设我有以下使用 Python3.x 的超大字符串,大小为几 GB,长度超过 100 亿个字符:

string1 = "XYZYXZZXYZZXYZYXYXZYXZYXZYZYZXY.....YY"

考虑到它的长度,这已经需要 +GB 才能加载到 RAM 中。

我想编写一个函数,将每个X 替换为A,将Y 替换为B,将Z 替换为C。我的目标是尽可能快地做到这一点。当然,这也应该是有效的(例如,我不确定可能会有一些 RAM 权衡)。

对我来说最明显的解决方案是使用string 模块和string.replace()

import string
def replace_characters(input_string):
    new_string = input_string.replace("X", "A").replace("Y", "B").replace("Z", "C")
    return new_string

foo = replace_characters(string1)
print(foo)

哪个输出

'ABCBACCABCCABCBABACBACBACBCBCAB...BB'

我担心这不是最有效的方法,因为我在如此大的数据结构上同时调用三个函数。

对于这么大的字符串,最有效的解决方案是什么?

【问题讨论】:

  • 你现在的表现如何?你有理由相信它在某些方面不令人满意吗?
  • @wallyk 这很笨重。我认为.replace() 是首先通过整个字符串。所以,这个函数实际上是三个函数调用,内存中至少保存了三个临时字符串。效率不是很高。

标签: python string python-3.x replace


【解决方案1】:

一种更节省内存的方法是使用str.translate

>>> string1 = "XYZYXZZXYZZXYZYXYXZYXZYXZYZYZXY"
>>> string1.translate({ord("X"): "A", ord("Y"): "B", ord("Z"): "C"})
'ABCBACCABCCABCBABACBACBACBCBCAB'

这将只分配一个(在您的情况下特别大)字符串。

【讨论】:

  • 哦,不知道这个。
  • @Coldspeed 应该比我预期的正则表达式快 很多
  • 哇!优秀的解决方案
  • 或者,您可以将整个数据读入一个数组 (docs.python.org/3/library/array.html),然后转换数组中的特定字节。无需分配另一个巨大的缓冲区。
猜你喜欢
  • 2012-09-09
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多