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]
时如何做同样的事情。但是,我只是在猜测,所以我希望有人确认/否认我的猜测。
答案 0 :(得分:10)
join
方法读取其输入两次;一次确定为结果字符串对象分配多少内存,然后再次执行实际连接。传递一个列表比传递一个它需要复制的生成器对象更快,以便它可以迭代两次。
列表推导不仅仅是包含在列表中的生成器对象,因此从外部构造列表比使用join
从生成器对象创建它更快。生成器对象针对内存效率而非速度进行了优化。
当然,字符串已经是一个可迭代对象,因此您只需编写''.join(text)
即可。 (同样,这也不如从字符串中明确创建列表那么快。)