2017-01-13 96 views
1

我有以下代码:写入变量然后写入文件或直接写入文件?

foo = json.loads(get_foo()) 

foo_file = '' 
for f in foo['datas']: 
    foo_file += f['bar'] + ' ' + f['barfoo'] + '\n' 

with open(output, 'w') as output: 
    output.write(foo_file) 

是否做了正确的方式,或者我应该直接写入文件是这样的:

foo = json.loads(get_foo()) 

with open(output, 'w') as output: 
    for f in foo['datas']: 
     output.write(f['bar'] + ' ' + f['barfoo'] + '\n') 

有一个变量较少使用,但文件已打开更多时间。是否有很多数据,对于直接写入文件的性能不是不好?

+0

这取决于..如果你需要对数据进行一些处理,那么额外的变量需要进入图片。否则直接使用它 –

+0

尝试使用大量输入的第一个选项,您会发现为什么最好不要尝试将所有内容都放在内存中。如果你只有一个进程/线程运行该代码,但是你的情况可能不是这样的问题(json内容通常不是那么大)... –

回答

1

通常当你写一个文件直接(代码)时,系统不会立即写入文件:它将使用有关缓冲操作系统的(OS)的政策:在内部,首先存储在内存中和只有当要写入的内容量超过某个阈值时,才将其写入文件。

使用open时,您还可以指定buffering

但是要回到你的问题:我认为性能差异不会那么大,而且它并不总是可以首先将所有内容存储在一个变量中:假设你想写一个1 TiB文件,没有办法将内容完全存储在内存中。

最后请注意,您最好使用.join和字符串格式来提高字符串构建的效率。这:

foo_file = '' 
for f in foo['datas']: 
    foo_file += f['bar'] + ' ' + f['barfoo'] + '\n' 

可以被替换为:

foo_file = ''.join('%s %s\n'%(f['bar'],f['barfoo']) for f in foo['datas']) 
0

我认为它不会有太大的区别,假设你的f()比较快。两者都很好。它可能取决于你需要它的情况,如果你以后需要获取数据,那么选项1会更好,否则选项2会有点整齐。

+0

'f'可能是一个字典,而不是函数。此外,我认为OP比CPU开销更关心I/O开销。 –

0

表现应该大致是相同的写入文件缓存。

你也可以做这样的:

foo = json.loads(get_foo()) 

with open(output, 'w') as output: 
    for f in foo['datas']: 
     output.write(f['bar'] + ' ' + f['barfoo'] + '\n') 
1

使用writelines这里,蟒蛇可以选择自己的最佳方式。

foo = json.loads(get_foo()) 

with open(output, 'w') as output: 
    output.writelines(
     '{} {}\n'.format(f['bar'],f['barfoo']) 
     for f in foo['datas'] 
    )