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

时间:2015-09-08 15:52:22

标签: python python-internals

join()函数接受iterable作为参数。但是,我想知道为什么要:

text = 'asdfqwer'

此:

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

明显快于:

''.join(c for c in text)

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

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

1 个答案:

答案 0 :(得分:10)

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

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

当然,字符串已经是一个可迭代对象,因此您只需编写''.join(text)即可。 (同样,这也不如从字符串中明确创建列表那么快。)