我有一个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)。
答案 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
可能会更快。