python - 有没有办法为Python中的长字符串分配内存?

标签 python string memory-management

我正在处理递归连接的字符串,长度约为 8000 万个字符。随着字符串长度的增加,Python 的速度会急剧减慢。

考虑以下循环:

s = ''
for n in range(0,r):
  s += 't'

我测得 r = 800,000 时运行时间为 86 毫秒,r = 8,000,000 时运行时间为 3.11 秒,r = 80,000,000 时运行时间为 222 秒

我猜测这与 python 如何为字符串分配额外的内存有关。有没有办法加快速度,例如在声明字符串 s 时为其分配完整的 80MB?

最佳答案

它不能用文本(字符串)对象以直接的方式完成,但是如果您处理字节,那么它是微不足道的 - 在这种情况下,您可以创建一个比最终结果更大的字节数组对象并插入您的值放入其中。

如果您需要最终对象作为文本,您可以将其解码为文本,单步将足够快。

由于您没有说明数据的性质,这可能会变得更困难 - 如果没有单字节编码可以涵盖您需要的所有字符,您必须求助于可变长度编码,例如 utf -8,或多字节编码,例如 utf-16 或 32。在这两种情况下,如果您正确跟踪插入索引,那就没有问题 - 这也将是重新编码的最终数据大小。 (如果您使用的都是遗传“GATACA”字符串,则只需使用 ASCII 编码即可完成)

data = bytearray(100_000_000) # 100 million positions - 
index = 0
for character in input_data:
    v = character.encode("utf-8")
    s = len(v)
    if s == 1:
        data[index] = v
    else:
        data[index: index + len(v)] = v
    index += len(v)
data_as_text = data[:index].decode("utf-8")

关于python - 有没有办法为Python中的长字符串分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70682135/

相关文章:

python - 为什么我的 Spark SVM 总是预测相同的标签?

python - numpy 切片返回最后两个维度

Python查找没有特定数字的最长数字串

C++ 2D数组内存分配

c++ - 为什么保留的虚拟内存会增长而当前正在使用的虚拟内存不会增长?

python - 创建给定开始和停止时间的间隔时间列表

javascript - 如何从 JavaScript 调用 Django 服务器中的 Python 脚本?

python - 如何使用反向分割线?

python - 检索引号之间的文本,包括转义引号

ios - Autorelease 用法说明