将一个字符串附加到另一个字符串时,效率很高优化操作,特别是对于多个串联的场景。问题中描述的传统方法 var3 = var1 var2 并不总是最有效的。
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中文网其他相关文章!