È possibile utilizzare itertools.chain, dividendo ogni linea e la mappatura di interi:
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]
Per uso python2 itertools.imap
invece di carta. utilizzando la catena con la mappa e itertools.chain evita di leggere tutti i file in memoria in una volta, il che è ciò che farà .read
.
Alcune tempi per python3 su un file lo stesso come ingresso * 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
Così itertools corrisponde all'elenco comp ma usa molta meno memoria.
Per 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
La lista comp è marginalmente più veloce, ma ancora una volta utilizza più memoria, se si andavano a leggere tutto in memoria con la lettura dividere approccio IMAP è di nuovo il più veloce:
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
Lo stesso vale per python3 e mappa:
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
Quindi, se la velocità è tutto ciò che interessa utilizzare l'approccio list(map(int,f.read().split()))
o list(imap(int,f.read().split()))
.
Se anche la memoria è una preoccupazione, combinala con la catena. Un altro vantaggio dell'approccio a catena se la memoria è un problema è che se si passano gli interi a una funzione o si scorre su di essa è possibile passare direttamente l'oggetto catena in modo tale che non sia necessario conservare tutti i dati in memoria.
Un ultimo piccolo ottimizzazione è quello di mappare str.split sul oggetto file:
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
Sono separati spazi/nuove righe? –