作者stimim (qqaa)
看板Python
标题Re: [问题] 将list快速写入档案的方式?
时间Tue Mar 8 11:54:18 2016
: with open('123.txt') as fi, open('456.txt', 'w') as fo:
: for _ in xrange(startindex): # 跳过 startindex 行
: fi.next()
: for _ in xrange(endindex - startindex):
: fo.write(fi.readline())
: 我不确定後面的方法会不会比较快, 但至少比较省记忆体(不用整个档读进来)
因为不用把整个档案读进记忆体,在档案大的时候肯定会比 readlines() 快不少
另外,我发现如果用 itertools + writelines 的话,可以再快一些
实验方法:
1. 生成档案:
n = 2 * 10 ** 7
for _ in xrange(n):
print _
2. 分别用下列的 main 函数来读档、写档
def main(i, o):
with open(i) as fi, open(o, 'w') as fo:
fo.writelines(itertools.islice(fi, 30, 1500000))
def main(i, o):
with open(i) as fi, open(o, 'w') as fo:
map(fo.write, itertools.islice(fi, 30, 1500000))
def main(i, o):
with open(i) as fi, open(o, 'w') as fo:
for _ in xrange(30):
fi.readline()
# fi.next() or next(fi) will cause ValueError on next fi.readline()
for _ in xrange(1500000 - 30):
fo.write(fi.readline())
3. Result:
https://imgur.com/1RkWRFC
可以看到 writelines + itertools 最快, map + write + itertools 次之
不过很神奇的是用 map 时,记忆体的使用量高了不少。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 72.14.230.41
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1457409261.A.DDE.html
1F:推 octantis: 请问你是怎麽监看时间的? 03/08 18:20
2F:→ uranusjr: 我猜可能是因为 map 还是会 allocate 一个 list 的关系 03/09 01:58
3F:→ uranusjr: 想看执行时间请参考 timeit module 03/09 01:58
4F:→ stimim: 我是装 memory_profiler (pip install memory_profiler) 03/09 09:55
5F:→ stimim: 然後用 mprof run xxx.py args... 03/09 09:55
6F:→ stimim: mprof plot 可以画图 03/09 09:56
7F:推 octantis: 感谢你, 我去试试, 我之前都用timeit只是他有图好方便XD 03/09 11:13