在Python中最快的输入读取方式

11 投票
6 回答
18680 浏览
提问于 2025-04-17 17:12

我想读取一个很大的文本文件,这个文件里面包含了一系列整数的列表。现在我正在做以下操作:

G = []
with open("test.txt", 'r') as f:
    for line in f:
        G.append(list(map(int,line.split())))

不过,这个操作大约需要17秒(通过timeit测试的)。有没有什么办法可以缩短这个时间?也许可以找个方法不使用map。

6 个回答

0

列表推导式通常会更快。

G = [[int(item) for item in line.split()] for line in f]

除此之外,可以试试PyPy、Cython和numpy。

5

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倍。

25

numpy有两个函数,分别是 loadtxtgenfromtxt,不过这两个函数的速度都不算快。在一些常用的库中,速度最快的文本读取函数是 pandas 里的 read_csv 函数(你可以在这里找到它:http://pandas.pydata.org/)。在我的电脑上,读取500万行,每行包含两个整数,使用 numpy.loadtxt 大约需要46秒,使用 numpy.genfromtxt 大约需要26秒,而使用 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

撰写回答