2016-12-21 1 views
1

Я ищу самый производительный способ экспортировать элементы до десяти Python списки [x1, x2, x3, ... xn], [y1, y2, y3, ... yn], [z1, z2, z3, ... zn], ... в текстовый файл со структурой следующим образом:быстрый способ экспорта данных из огромного списка Python в текстовый файл

x1 y1 z1 . . . 
x2 y2 z2 . . . 
x3 y3 z3 . . . 
. . . . . . 
. . . . . . 
. . . . . . 
xn yn zn . . . 

Что бросает вызов, так это то, что в каждом списке может быть до 1 миллиона элементов.

Любые предложения приветствуются.

+0

Что содержит списки? Смешать строку и числа или любой из них? – MYGz

+0

только плавающие или внутренние номера – Rickson

+0

Проверьте мое решение. И не забудьте сообщить, если вы найдете еще более быстрый. – MYGz

ответ

4

Используйте модуль 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) 

пишет 100 строк 100000 элементов в 2-х секунд на моей машине (генерируя список был медленнее, чем писать их обратно)

Так вы просто ограничивается память вашего входного списка.

EDIT: этот код выше не «транспонируется» должным образом, поэтому он обманывает. Использование 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] 

вы можете использовать * расширить список в аргументы для zip или izip:

cw.writerows(zip(*lists_of_lists)) 

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

Я думаю, что OP хочет застегнуть списки и написать соответствующие элементы в одной строке. Проверьте мое решение. Знаете ли вы еще более быстрый способ? – MYGz

+0

Я неправильно читаю почтовый аспект. Ваше решение работает. Вам нужно 'izip' для python 3? 'zip' уже возвращает итератор. –

+0

Мохаммад прав. Его решение уже очень быстро. Мне также было бы интересно, есть ли еще более быстрый способ. – Rickson

3

Вы может сделать что-то вроде этого:

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) 
+0

Спасибо Мохаммад. Работает отлично и быстро. – Rickson

+1

уважение и +1 для правильного чтения вопроса :), который сказал, что 'writows' без цикла должен работать еще быстрее, проверьте мое решение. –

+0

К сожалению, я могу принять только один ответ ... – Rickson

Смежные вопросы