Python 的字符串拼接函数 join()是怎么实现的
我说用”.join()传入列表作拼接;然后面试官问为什么 join 比 for 循环内字符串一个一个累加要速度快,我说是因为累加会有额外的中间临时变量,导致性能损失。
然后面试官问我,怎么自己写个函数实现 join()的功能,我想了很久没想出来,请教大佬们这个问题何解
我说用”.join()传入列表作拼接;然后面试官问为什么 join 比 for 循环内字符串一个一个累加要速度快,我说是因为累加会有额外的中间临时变量,导致性能损失。
然后面试官问我,怎么自己写个函数实现 join()的功能,我想了很久没想出来,请教大佬们这个问题何解
什么叫做“自己实现 join 的功能”?
如果你要求相同的时间复杂度且不能用 Python 的 join 恐怕不行,因为 join 是 Python 自己实现的,可以想象它先算好最终长度,然后分配内存,最后写入数据。
如果只是希望实现相同的功能,不论时间,则用平衡分组连接比较好,这只需要 NlogN 的时间。
cpython/Objects/stringlib/join.h
参见: https://cs.stackexchange.com/questions/63752/amortized-time-cost-of-insertion-into-an-array-list
如果自己实现的话,问题的关键就是如何避免重复分配内存。
可以遍历一遍字符串计算出需要的内存,一次分配好。或者像 #14 所说的每次把 buffer 翻倍,但是我觉得这样没必要,我们一般在所需内存不确定的时候才会使用这个方案,如果所需的内存是确定的话一次到位是更好地选择。