前言:这类似于Create lines of text, '\n'.join(my_list) is missing trailing newline :-(,除了这里是生成器,而不是列表。

我需要从生成器函数生成一个文本文件,该文件会生成不以行结尾的单个字符串行。

我相信推荐的构建这样一个字符串的方法是(假设g是生成器对象)

'\n'.join(g)


但是,这将错过结尾的换行符。

这是使用','代替'\n'的示例:

>>> g=(str(i) for i in range(0,10))
>>> ','.join(g)
'0,1,2,3,4,5,6,7,8,9'


当然,我可以在最后手动输入+ '\n',但是我相信这样做可能会变得昂贵。

我尝试使用itertools.chain()附加一个空字符串,但这产生了令人惊讶的结果:

>>> import itertools
>>> g=itertools.chain((str(i) for i in range(0,10)),'')
>>> ','.join(g)
'0,1,2,3,4,5,6,7,8,9'


我实际上该怎么做? + '\n'真的那么贵吗?

最佳答案

您可能会惊讶地听到,但是将生成器转换为列表,附加空("")值并使用str.join将是您最快的方法。

我喜欢您的想法,您希望使用生成器来提高效率,但是"".join实际上在加入之前将genexp内部转换为列表。这样做的原因是因为它需要测量最终字符串的长度并相应地分配内存。这样,它在生成器上进行了两次传递(基本上是创建一个列表以临时保存值)

py -3 -m timeit "''.join([str(i) for i in range(100000)])"
10 loops, best of 5: 29.6 msec per loop

py -3 -m timeit "''.join((str(i) for i in range(100000)))"
10 loops, best of 5: 32.3 msec per loop


占用相同的内存。

关于python - 使用'\n'时添加尾随分隔符.join(generator),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52243119/

10-12 00:48
查看更多