Python 3.7-连接字符串并将其写入磁盘的快速方法



有更好的实现吗

file = open("./myFile.txt","w+")
for doc in allDocuments: #around 35 million documents
file.write(str(doc.number)+"rn")
f.close()

目前,这种实现每个文件需要20秒

I/O并不是真正的问题,也不能对此做任何有用的事情:文件对象和操作系统都将进行某种形式的缓冲。可以做的事情是您进行的方法调用的数量。

with open("./myFile.txt", "w", newline='rn') as f:
f.writelines(f'{doc.number}n' for doc in allDocuments)

writelines方法采用可迭代的字符串来写入文件。(文档中说的是"list",但它似乎指的是列表,而不是lists;生成器表达式似乎也能工作。(生成器表达式根据writelines的需要生成每一行。


这里有一个测试:

import random
def allDocuments():
for i in range(35_000_000):
yield random.randint(0, 100)
with open("tmp.txt", "w", newline='rn') as f:
f.writelines(f'{doc}n' for doc in allDocuments())

它在75秒内完成(其中大部分是由于对random.randint的重复调用(,使用了不到6MB的内存。(将对random.randint的调用替换为常数值,使运行时间降至30秒以下。(

您可以缓冲输出并写入块:

with open("./myFile.txt", "w") as output:
lines = []
for doc in allDocuments:
lines.append(f"{doc.number}rn")
if len(lines) > 1000:
output.writelines(lines)
lines = []
output.writelines(lines)

相关内容

最新更新