Python:更好地理解迭代器和 `join()`

Python: understanding iterators and `join()` better

join() 函数接受一个可迭代对象作为参数。但是,我想知道为什么有:

text = 'asdfqwer'

这个:

''.join([c for c in text])

明显快于:

''.join(c for c in text)

长字符串(即 text * 10000000)也是如此。

观察两个长字符串执行的内存占用,我认为它们都在内存中创建一个且只有一个字符列表,然后将它们连接成一个字符串。所以我猜也许区别仅在于 join() 如何从生成器中创建此列表以及 Python 解释器在看到 [c for c in text] 时如何做同样的事情。但是,再次重申,我只是在猜测,所以我希望有人 confirm/deny 我的猜测。

join 方法读取其输入两次;一次确定为结果字符串对象分配多少内存,然后再次执行实际的连接。传递一个列表比传递一个生成器对象要快,生成器对象需要创建一个副本以便迭代两次。

列表推导式不仅仅是包含在列表中的生成器对象,因此在外部构建列表比 join 从生成器对象创建列表更快。生成器对象针对内存效率而非速度进行了优化。

当然,一个字符串已经一个可迭代的对象,所以你可以只写''.join(text)。 (同样,这不如从字符串显式创建列表快。)