如果该
str.join方法不是列表或元组,则将其可迭代参数转换为列表。这样,联接逻辑就可以对项目进行多次迭代(通过一次传递来计算结果字符串的大小,然后进行第二次传递以实际复制数据)。
您可以在CPython源代码中看到这一点:
PyObject *PyUnipre_Join(PyObject *separator, PyObject *seq){ fseq = PySequence_Fast(seq, "can only join an iterable"); }PySequence_FastC
API中的功能正是我所描述的。它将一个任意的Iterable转换为一个列表(基本上是通过调用
list它),除非它已经是一个列表或元组。
将生成器表达式转换为列表意味着生成器的通常好处(较小的内存占用量和发生短路的可能性)不适用于
str.join,因此生成器具有的(较小)额外开销使性能得以提高。更差。


![带有连接功能的列表vs生成器理解速度[重复] 带有连接功能的列表vs生成器理解速度[重复]](http://www.mshxw.com/aiimages/31/382646.png)
