首页  >  文章  >  后端开发  >  Python 的字符串连接有多高效,何时优化?

Python 的字符串连接有多高效,何时优化?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 00:27:29984浏览

 How Efficient Is Python's String Concatenation, and When Does It Optimize?

如何在 Python 中高效地将一个字符串附加到另一个字符串?

将一个字符串附加到另一个字符串时,效率很高优化操作,特别是对于多个串联的场景。问题中描述的传统方法 var3 = var1 var2 并不总是最有效的。

CPython Optimization

CPython,Python 的默认实现,当仅存在一个对初始字符串的引用时,对字符串连接采用特定的优化。此优化尝试就地扩展字符串,从而导致摊销 O(n) 操作。这意味着对于以下场景:

s = ""
for i in range(n):
    s += str(i)

,以前的时间复杂度为 O(n^2),现在的速度明显更快,为 O(n)。

实现详细信息

CPython 的优化是在 bytesobject.c 中的 _PyBytes_Resize 函数中实现的。它为字符串对象重新分配内存,将其大小增加指定的量。如果成功,它会更新字符串的大小并设置尾随空字节以终止字符串。

经验验证

要凭经验演示此优化,请考虑以下内容timeit 结果:

$ python -m timeit -s"s=''" "for i in xrange(10):s+='a'"
1000000 loops, best of 3: 1.85 usec per loop
$ python -m timeit -s"s=''" "for i in xrange(100):s+='a'"
10000 loops, best of 3: 16.8 usec per loop
$ python -m timeit -s"s=''" "for i in xrange(1000):s+='a'"
10000 loops, best of 3: 158 usec per loop
$ python -m timeit -s"s=''" "for i in xrange(10000):s+='a'"
1000 loops, best of 3: 1.71 msec per loop
$ python -m timeit -s"s=''" "for i in xrange(100000):s+='a'"
10 loops, best of 3: 14.6 msec per loop
$ python -m timeit -s"s=''" "for i in xrange(1000000):s+='a'"
10 loops, best of 3: 173 msec per loop

对于较小的字符串,开销很小,但随着字符串大小的增加,优化方法的效率显着提高。

注意

;

需要注意的是,这种优化并不是 Python 规范的一部分。它是 CPython 的特定实现细节,可能不会出现在 PyPy 或 Jython 等其他 Python 实现中。

以上是Python 的字符串连接有多高效,何时优化?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn