有没有办法分割python字符串而不生成新字符串?

2024-06-01 11:02:34 发布

您现在位置:Python中文网/ 问答频道 /正文

输入是一个包含大量字符的字符串,我希望用一个特殊的分隔符将这个字符串拆分成一个字符串列表。在

但是我想,仅仅使用split将生成新的字符串,而不是拆分原始的输入字符串本身,在这种情况下,它会消耗大量内存(可以保证原始字符串不再被使用)。在

那么有没有一个方便的方法来做这种破坏性的分裂呢?在

情况如下:

input_string = 'data1 data2 <...> dataN'
output_list = ['data1', 'data2', <...> 'dataN']

我希望输出列表中的data1与输入字符串中的data1(以及所有其他)共享相同的内存区域。在

顺便说一句,对于每个输入字符串,大小是10MB-20MB;但是由于有很多这样的字符串(大约100个),所以我想这里应该考虑内存消耗?在


Tags: 方法内存字符串列表inputstring情况字符
3条回答

在Python中,字符串是不可变的。这意味着任何更改字符串的操作都将创建一个新字符串。如果您担心内存(虽然这不是什么大问题,除非您处理的是巨大的字符串),您可以总是用新的、修改过的字符串覆盖旧字符串,替换它。在

不过,您描述的情况稍有不同,因为split的输入是一个字符串,而输出是一个字符串列表。他们是不同的类型。在本例中,我只需创建一个包含split输出的新变量,然后将旧字符串(即split函数的输入)设置为None,因为您可以保证它不会再次使用。在

代码:

split_str = input_string.split(delim)
input_string = None

也许python的方法是使用迭代器?这样,新的子串一次只能在内存中出现一个。基于 Splitting a string into an iterator

import re
string_long = "my_string " * 100000000 # takes some memory
# strings_split = string_long.split()  # takes too much memory
strings_reiter = re.finditer("(\S*)\s*", string_long) # takes no memory
for match in strings_reiter:
    print match.group()

这样可以很好地工作而不会导致内存问题。在

唯一的选择是使用切片而不是split来访问子字符串。您可以使用str.find来查找每个分隔符的位置。然而,这将是缓慢和微妙的。如果您可以使用split并将原始字符串从作用域中删除,那么这样做是值得的。在

你说这个字符串是输入的,所以你可以考虑读更少的字符,这样你就可以处理更容易管理的块了。你真的需要所有的数据同时存储在内存中吗?在

相关问题 更多 >