擅长:python、mysql、java
<p>I/O不是真正的问题,您也不能对此做任何有用的事情:文件对象和操作系统都将执行某种形式的缓冲。您<em>可以</em>做的事情是您进行的方法调用的数量</p>
<pre><code>with open("./myFile.txt", "w", newline='\r\n') as f:
f.writelines(f'{doc.number}\n' for doc in allDocuments)
</code></pre>
<p><code>writelines</code>方法接受一组字符串写入文件。(虽然<a href="https://docs.python.org/3/library/io.html#io.IOBase.writelines" rel="nofollow noreferrer">documentation</a>表示“list”,但它似乎指的是list,而不是<code>list</code>;生成器表达式似乎也可以工作。)生成器表达式根据需要生成<code>writelines</code>的每一行</p>
<hr/>
<p>这里有一个测试:</p>
<pre><code>import random
def allDocuments():
for i in range(35_000_000):
yield random.randint(0, 100)
with open("tmp.txt", "w", newline='\r\n') as f:
f.writelines(f'{doc}\n' for doc in allDocuments())
</code></pre>
<p>它在75秒内完成(大部分是由于对<code>random.randint</code>的重复调用),使用的内存不到6MB。(用常量值替换对<code>random.randint</code>的调用会将运行时间降低到30秒以下。)</p>