批量文件写入或以较小的部分写入文件更快吗?

时间:2018-07-05 19:02:57

标签: python json file-io io

我有一个python脚本,可读取平面文件并将记录写入JSON文件。一次全部写入会更快吗?

dict_array = []
for record in records:
    dict_array.append(record)
# writes one big array to file
out_file.write(json.dumps(dict_array))

还是在迭代器产生每条记录时写入文件?

for record in records:
    out_file.write(json.dumps(record) + '\n')

records中的记录量约为81,000

此外,JSON的格式可以是一大组对象(案例1)或行分隔的对象(案例2)。

2 个答案:

答案 0 :(得分:1)

您的两个解决方案没有做相同的事情。第一个写入有效的JSON对象。第二篇文章写了一个可能有效(但要小心)的JSONlines(也可能是NDJSON / LDJSON和NDJ)文件。因此,以后处理数据的方式将大不相同。这就是这里最重要的事情-您要JSON文件还是JSONlines文件?

但是既然您问性能,那就取决于。

Python文件默认情况下是缓冲的,因此执行一堆小写操作仅比进行一次大写操作慢一点。但这比微小慢一点,而不是

另一方面,在内存中建立一个巨大的列表意味着分配和复制,而这在其他情况下是不需要的。除非您的值很小并且您的列表也很短,否则这几乎肯定会更有意义。

在没有看到您的数据的情况下,我会给出约10:1的可能性,即迭代解决方案的生成速度会更快,但是为什么要依靠这种几乎没有教养的猜测呢?如果有问题,请使用timeit来评估您的实际数据。

另一方面,81,000条典型的JSON记录基本上没有任何内容,因此,除非您进行无数次此操作,否则甚至不值得测量。如果您花一个小时弄清楚如何进行测量,运行测试并解释结果(更不用说花费在SO上的时间),那么每天就可以节省23毫秒,大约一周,然后再也没有了……那么,一个程序员,这总是很吸引人,但是仍然不总是一个好主意。

答案 1 :(得分:-1)

with tempfile.NamedTemporaryFile(suffix='.csv', prefix=('student_' + studentID),
        delete=False, mode='w+') as csvfile:
    filewriter = csv.writer(csvfile, delimiter=',')
    filewriter.writerow([ #WRITE CONTENT HERE])

我不知道import json dict_array = [] records = range(10**5) start = time.time() for record in records: dict_array.append(record) out_file.write(json.dumps(dict_array)) end = time.time() print(end-start) #0.07105851173400879 start = time.time() for record in records: out_file.write(json.dumps(record) + '\n') end = time.time() print(end-start) #1.1138122081756592 start = time.time() out_file.write(json.dumps([record for record in records])) end = time.time() print(end-start) #0.051038265228271484 是什么,但是基于这些测试,列表理解是最快的,其次是构造列表并一次写入所有列表,然后一次写入一个记录。根据{{​​1}}的不同,仅执行records可能会更快。