Вы можете использовать itertools.chain, разделив каждую строку и отображение на Интс:
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]
Для использования python2 itertools.imap
вместо карты. используя цепочку с картой и itertools.chain избегает сразу считывать весь файл в память, что будет делать .read
.
Некоторые тайминги для Python3 на файл такой же, как ваш вклад * 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
Так itertools соответствует списку комп, но использует намного меньше памяти.
Для 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
Список Комп немного быстрее, но опять использует больше памяти, если вы собираетесь читать все в памяти с чтения расколоть подход IMAP снова самый быстрый:
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
То же самое для Python3 и карты:
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
Так что, если скорость все, что вы заботитесь о используйте подход list(map(int,f.read().split()))
или list(imap(int,f.read().split()))
.
Если память также вызывает беспокойство, объедините ее с цепью. Еще одно преимущество цепного подхода, если память вызывает беспокойство, - если вы передаете функции int или выполняете итерацию, вы можете передать объект цепи напрямую, чтобы вам не нужно было хранить все данные в памяти вообще.
последнее небольшая оптимизация является отображение str.split на объекте файла:
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
Разделяются ли они пробелами/символами новой строки? –