簡體   English   中英

將巨大的Python列表數據導出到文本文件的最快方法

[英]Fastest way to export data of huge Python lists to a text file

我正在尋找導出最多十個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  .  .  .

具有挑戰性的是,每個列表可能包含多達一百萬個元素。

任何建議都將受到高度贊賞。

使用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)

在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)

對於python2,請使用itertools.izip因為zip返回一個列表:不節省內存。 符合Python 2的代碼:

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

如果您有一個列表列表:

list_of_lists = [list1,list2,list3]

您可以使用*將列表擴展為zipizip參數:

cw.writerows(zip(*lists_of_lists))

cw.writerows(itertools.izip(*lists_of_lists))

您可以執行以下操作:

from itertools import izip
import csv

with open('new_file', 'w') as f:
    writer = csv.writer(f, delimiter=' ')
    for a in izip(l1, l2, ....., l10):
        writer.writerow(a)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM