将大量 Python 列表数据导出到文本文件的最快方法

Ric*_*son 1 python csv bigdata python-2.7

我正在寻找将最多十个 Python 列表的元素导出[x1, x2, x3, ... xn], [y1, y2, y3, ... yn], [z1, z2, z3, ... zn], ...到结构如下的文本文件的最高效方法:

x1 y1 z1  .  .  . 
x2 y2 z2  .  .  .
x3 y3 z3  .  .  .
 .  .  .  .  .  .
 .  .  .  .  .  .
 .  .  .  .  .  .
xn yn zn  .  .  .
Run Code Online (Sandbox Code Playgroud)

具有挑战性的是每个列表可能最多有 100 万个元素(仅限浮点或整数)

任何建议都将受到高度赞赏。

Jea*_*bre 5

使用该csv模块和writerows函数将列表的列表写在一行中。

小型独立测试:

import random,time


lists = [[random.randint(1,500) for _ in range(100000)] for _ in range(100)]

import csv
start_time=time.time()

with open("out.csv","w",newline="") as f:
    cw = csv.writer(f,delimiter=" ")
    cw.writerows(lists)

print(time.time()-start_time)
Run Code Online (Sandbox Code Playgroud)

在我的机器上 2 秒内写入 100 行 100000 个元素(生成列表比写回它们慢)

所以你只是受到输入列表内存的限制。

编辑:上面的代码没有正确“转置”,所以它是作弊的。使用zip(python 3) 直接使用即可实现这一点writerows,因此代码不会改变太多:

import random,time

n=1000000
list1 = list(range(1,n))
list2 = list(range(n+1,n*2))
list3 = list(range(2*n+1,n*3))

import csv
start_time=time.time()

with open("out.csv","w",newline="") as f:
    cw = csv.writer(f,delimiter=" ")
    cw.writerows(zip(list1,list2,list3))

print(time.time()-start_time)
Run Code Online (Sandbox Code Playgroud)

对于 python2,使用itertools.izipbecausezip返回一个列表:内存效率不高。Python 2 兼容代码:

import itertools
with open("out.csv","wb") as f:
    cw = csv.writer(f,delimiter=" ")
    cw.writerows(itertools.izip(list1,list2,list3))
Run Code Online (Sandbox Code Playgroud)

如果您有一个列表列表:

list_of_lists = [list1,list2,list3]
Run Code Online (Sandbox Code Playgroud)

您可以使用*将列表扩展为zipor的参数izip

cw.writerows(zip(*lists_of_lists))

cw.writerows(itertools.izip(*lists_of_lists))
Run Code Online (Sandbox Code Playgroud)