我最近发现我的一个学生正在做一个独立的项目,其中他使用非常大的字符串(2-4MB)作为字典中的值。

我从来没有理由要处理这么大的文本块,这让我想知道创建这么大的字符串是否存在性能问题。

除了简单地创建字符串,还有更好的方法吗?我意识到这个问题在很大程度上取决于上下文,但是我正在寻找可以涵盖多个可能用例的通用答案。

如果要处理这么多文本,该如何将其存储在代码中,并且与仅使用仅包含几个字符的普通字符串进行处理相比,您会做其他不同的事情吗?

最佳答案

这很大程度上取决于您对字符串的处理方式。我不确定Python如何存储字符串,但是我已经在XEmacs(类似于GNU Emacs)和Emacs Lisp的底层实现上做了很多工作,后者是像Python这样的动态语言,而且我知道字符串是如何在那里实现。字符串将被存储为类似于数组的内存块。在Python中创建大型数组并没有很大的问题,因此我不认为仅以这种方式存储字符串会导致性能问题。不过,请注意以下几点:

  • 您如何构建字符串?如果仅通过追加到更大的字符串来逐步构建,则O(N ^ 2)算法将非常缓慢。 Java使用StringBuilder类处理此问题。我不确定Python是否有完全等效的方法,但是您可以简单地创建一个数组,其中包含所有要连接的部分,然后使用''.join(array)进行最后连接。
  • 是否需要搜索字符串?这与创建字符串无关,但是需要考虑。通常,搜索的字符串大小为O(n);有些加速使它变为O(n/m),其中m是您要搜索的子字符串的大小,仅此而已。这里主要考虑的是存储一个大字符串还是一系列子字符串。如果您需要搜索所有子字符串,那么这对于搜索大字符串没有多大帮助,但是您可能会事先知道不需要搜索某些部分。
  • 您需要访问子字符串吗?同样,这与创建字符串无关,这是需要考虑的事情。按位置访问子字符串只是索引到正确的内存位置,但是如果您需要使用较大的子字符串,则效率可能会很低,并且可以通过将字符串存储为子字符串数组来加快处理速度,然后创建一个新的字符串作为另一个共享一些字符串的数组。但是,以这种方式进行工作需要工作,除非确实必要,否则不应该这样做。

  • 总而言之,我认为在简单的情况下,具有这样的大字符串是可以的,但是您应该考虑将要执行的各种操作以及它们的O(...)时间。

    关于python - 如何最好地在Python中存储较大的文本序列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20939204/

    10-12 14:28