tem*_*ame 5 python string python-3.x
我最近发现,我的学生在做中,他使用一个独立的项目非常大的字符串(2-4MB)如在字典中的值。
我从来没有理由要处理这么大的文本块,这让我想知道创建这么大的字符串是否存在性能问题。
是否有比仅创建字符串更好的方法?我意识到这个问题很大程度上取决于上下文,但是我正在寻找可以涵盖多个可能用例的通用答案。
如果要处理这么多文本,该如何将其存储在代码中,并且与仅使用仅包含几个字符的普通字符串进行处理相比,您会做些其他事情吗?
这在很大程度上取决于您对琴弦的操作。我不太清楚Python如何存储字符串,但我在XEmacs(类似于GNU Emacs)和Emacs Lisp的底层实现上做了很多工作,Emacs Lisp是一种像Python一样的动态语言,我知道字符串是如何存储的在那里实施。字符串将被存储为类似于数组的内存块。在 Python 中创建大型数组并不是什么大问题,因此我认为简单地以这种方式存储字符串不会导致性能问题。但需要考虑一些事情:
你如何构建字符串?如果您通过简单地附加到更大的字符串来逐段构建,那么您的算法将非常慢的 O(N^2)。Java 用一个StringBuilder类来处理这个问题。我不确定 Python 中是否有完全等同的东西,但您可以简单地创建一个包含要连接在一起的所有部分的数组,然后在最后使用''.join(array).
您需要搜索字符串吗?这与创建字符串无关,但需要考虑。就字符串大小而言,搜索通常是 O(n);有些加速使其达到 O(n/m),其中 m 是您正在搜索的子字符串的大小,但仅此而已。这里主要考虑的是是存储一个大字符串还是一系列子字符串。如果您需要搜索所有子字符串,这与搜索大字符串相比没有多大帮助,但您可能会提前知道某些部分不需要搜索。
您需要访问子字符串吗?同样,这与创建字符串无关,这是需要考虑的事情。按位置访问子字符串只是索引到正确的内存位置的问题,但如果您需要获取较大的子字符串,则可能效率低下,并且您可以通过将字符串存储为子字符串数组来加快速度,然后创建一个新字符串作为另一个数组,并共享一些字符串。然而,这样做需要工作,除非确实有必要,否则不应该这样做。
总之,我认为对于简单的情况,使用像这样的大字符串很好,但是您应该考虑要执行的操作类型以及它们的 O(...) 时间是多少。
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |