我想读一个包含整数列表的列表一个巨大的文本文件。 现在我做了以下内容:
G = []
with open("test.txt", 'r') as f:
for line in f:
G.append(list(map(int,line.split())))
然而,它需要大约17秒(通过timeit)。 有什么办法来减少这个时间呢? 也许,有一种方法不使用地图。
我想读一个包含整数列表的列表一个巨大的文本文件。 现在我做了以下内容:
G = []
with open("test.txt", 'r') as f:
for line in f:
G.append(list(map(int,line.split())))
然而,它需要大约17秒(通过timeit)。 有什么办法来减少这个时间呢? 也许,有一种方法不使用地图。
numpy的具有功能loadtxt
和genfromtxt
,但也不是特别快。 在一个广泛分布的库最快的文本阅读器是read_csv
在功能pandas
( http://pandas.pydata.org/ )。 在我的计算机,读取每行包含两个整数花费约46秒,500万行numpy.loadtxt
26秒numpy.genfromtxt
,并稍微超过1秒钟pandas.read_csv
。
下面是显示结果的会议。 (这是在Linux,Ubuntu的12.04 64位你不能看到它在这里,但该文件的每次读取后,磁盘缓存是由运行清除。 sync; echo 3 > /proc/sys/vm/drop_caches
在一个单独的贝壳。)
In [1]: import pandas as pd
In [2]: %timeit -n1 -r1 loadtxt('junk.dat')
1 loops, best of 1: 46.4 s per loop
In [3]: %timeit -n1 -r1 genfromtxt('junk.dat')
1 loops, best of 1: 26 s per loop
In [4]: %timeit -n1 -r1 pd.read_csv('junk.dat', sep=' ', header=None)
1 loops, best of 1: 1.12 s per loop
pandas
是基于numpy
有C
基于文件分析器这是非常快:
# generate some integer data (5 M rows, two cols) and write it to file
In [24]: data = np.random.randint(1000, size=(5 * 10**6, 2))
In [25]: np.savetxt('testfile.txt', data, delimiter=' ', fmt='%d')
# your way
In [26]: def your_way(filename):
...: G = []
...: with open(filename, 'r') as f:
...: for line in f:
...: G.append(list(map(int, line.split(','))))
...: return G
...:
In [26]: %timeit your_way('testfile.txt', ' ')
1 loops, best of 3: 16.2 s per loop
In [27]: %timeit pd.read_csv('testfile.txt', delimiter=' ', dtype=int)
1 loops, best of 3: 1.57 s per loop
所以pandas.read_csv
大约需要一个半第二读取数据和比你的方法快10倍左右。
作为一个一般的经验法则(几乎任何语言),使用read()
,以在整个文件中读取的将是比读一行在同一时间更快。 如果你没有通过内存受限,读取整个文件一次,然后将数据分割的换行符,然后通过行列表进行迭代。
最简单的加速会去PyPy http://pypy.org/
接下来的问题没有看过所有的文件(如果可能)。 相反,像流处理它。
List内涵往往更快。
G = [[int(item) item in line.split()] for line in f]
除此之外,尝试PyPy以及用Cython与numpy的
您也可以尝试通过批量插入带来的数据到数据库中,然后用一组操作处理您的记录。 根据你所要做的,这可能是速度更快,因为批量插入软件针对这种类型的任务进行了优化。