Można użyć itertools.chain, dzieląc każdą linię i mapowanie do int:
from itertools import chain
with open("in.txt") as f:
print(list((map(int,chain.from_iterable(line.split() for line in f)))))
[1, 19, 15, 36, 23, 18, 39, 2, 36, 23, 4, 18, 26, 9, 3, 35, 6, 16, 11]
Do stosowania python2 itertools.imap
zamiast mapie. używając łańcucha z mapą i itertools.chain unika się natychmiastowego odczytu całego pliku do pamięci, co zrobi .read
.
Niektóre czasy dla python3 na pliku taka sama jak wejścia * 1000:
In [5]: %%timeit
with open("ints.txt","r") as f:
list(map(int,re.split(r"\s+",f.read())))
...:
100 loops, best of 3: 8.55 ms per loop
In [6]: %%timeit
with open("ints.txt","r") as f:
list((map(int, chain.from_iterable(line.split() for line in f))))
...:
100 loops, best of 3: 5.76 ms per loop
In [7]: %%timeit
...: with open("ints.txt","r") as f:
...: [int(i) for i in f.read().split()]
...:
100 loops, best of 3: 5.82 ms per loop
Więc itertools pasuje do listy komp ale zużywa dużo mniej pamięci.
Dla python2:
In [3]: %%timeit
with open("ints.txt","r") as f:
[int(i) for i in f.read().split()]
...:
100 loops, best of 3: 7.79 ms per loop
In [4]: %%timeit
with open("ints.txt","r") as f:
list(imap(int, chain.from_iterable(line.split() for line in f)))
...:
100 loops, best of 3: 8.03 ms per loop
In [5]: %%timeit
with open("ints.txt","r") as f:
list(imap(int,re.split(r"\s+",f.read())))
...:
100 loops, best of 3: 10.6 ms per loop
Lista komp jest nieznacznie szybciej, ale ponownie wykorzystuje więcej pamięci, jeśli chcieć czytać wszystko w pamięci z odczytu podzielić podejście IMAP jest ponownie najszybszy:
In [6]: %%timeit
...: with open("ints.txt","r") as f:
...: list(imap(int, f.read().split()))
...:
100 loops, best of 3: 6.85 ms per loop
samo dla python3 i mapy:
In [4]: %%timeit
with open("ints.txt","r") as f:
list(map(int,f.read().split()))
...:
100 loops, best of 3: 4.41 ms per loop
Więc jeśli prędkość jest wszystko, czego zależy użyj podejścia list(map(int,f.read().split()))
lub list(imap(int,f.read().split()))
.
Jeśli pamięć również jest problemem, połącz ją z łańcuchem. Kolejną zaletą podejścia łańcuchowego, jeśli pamięć jest problemem, jest to, że jeśli przekazujesz ints do funkcji lub iterujesz, możesz bezpośrednio przekazać obiekt łańcucha, więc nie musisz w ogóle przechowywać wszystkich danych w pamięci.
ostatnia mała optymalizacja jest mapowanie str.split na obiekcie pliku:
In [5]: %%timeit
with open("ints.txt", "r") as f:
list((map(int, chain.from_iterable(map(str.split, f)))))
...:
100 loops, best of 3: 5.32 ms per loop
Czy rozdzielono spacery/znaki nowej linii? –