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)
。 (同样,这不如从字符串显式创建列表快。)
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)
。 (同样,这不如从字符串显式创建列表快。)