如何最好地在Python中存储大量文本?

时间:2014-01-05 21:09:24

标签: python string python-3.x

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

我从来没有理由使用这么大的文本块,这让我想知道是否存在与创建如此大的字符串相关的性能问题。

有没有比简单创建字符串更好的方法呢?我意识到这个问题主要取决于上下文,但我正在寻找可能涵盖多个可能用例的广义答案。

如果您正在使用那么多文本,那么如何将它存储在代码中,并且如果您只使用只有几个字符的普通字符串,您会做些什么吗?

2 个答案:

答案 0 :(得分:1)

这很大程度上取决于你对字符串的处理方式。我不完全确定Python如何存储字符串,但我已经在XEmacs(类似于GNU Emacs)和Emacs Lisp的底层实现上做了很多工作,这是一种像Python这样的动态语言,我知道字符串是怎样的在那里实施。字符串将被存储为类似于数组的内存块。在Python中创建大型数组并不是一个大问题,所以我不认为简单地以这种方式存储字符串会导致性能问题。有些事情需要考虑:

  1. 你是如何建立这个字符串的?如果你通过简单地附加到更大的字符串来逐个构建,那么你的O(N ^ 2)算法将非常慢。 Java使用StringBuilder类处理此问题。我不确定Python中是否存在确切的等价物,但您只需创建一个包含您想要连接在一起的所有部分的数组,然后使用''.join(array)在最后加入。

  2. 您需要搜索字符串吗?这与创建字符串无关,但需要考虑。搜索通常是字符串大小的O(n);有加速度使其成为O(n / m),其中m是您正在搜索的子字符串的大小,但这就是它。这里主要考虑的是存储一个大字符串还是一系列子字符串。如果您需要搜索所有子字符串,那么搜索大字符串将无济于事,但您可能事先知道某些部分不需要搜索。

  3. 您需要访问子字符串吗?同样,这与创建字符串无关,这是需要考虑的事情。按位置访问子字符串只是索引到正确的内存位置,但是如果需要获取大的子字符串,它可能效率低下,并且您可以通过将字符串存储为子字符串数组来加快速度,然后创建一个新字符串作为另一个数组,其中一些字符串共享。但是,这样做是需要工作的,除非真的有必要,否则不应该这样做。

  4. 总而言之,我认为对于简单的情况来说,拥有这样的大字符串是很好的,但你应该考虑一下你将要执行的各种操作以及它们的O(...)时间。

答案 1 :(得分:0)

我想说潜在问题取决于两件事:

  • 与内存(RAM)的容量相比,此类内存中有多少个字符串同时存在?

  • 对这些字符串进行了哪些操作?
    在我看来,我已经读过Python中对字符串的操作是非常有效的,所以它不应该在非常长的字符串上呈现问题。但实际上它取决于对大字符串执行的每个操作的算法。

这个答案相当模糊,我没有足够的经验来对问题做出更有用的估计。但问题也很广泛。