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

Ser*_*nov 12 python input readfile python-3.x

我想读一个包含整数列表列表的大文本文件.现在我正在做以下事情:

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

但是,它需要大约17秒(通过时间).有没有办法减少这个时间?也许,有一种方法不使用地图.

War*_*ser 24

numpy的具有的功能loadtxtgenfromtxt,但也不是特别快.广泛分布的库中最快的文本阅读器之一是(http://pandas.pydata.org/)中的read_csv功能.在我的计算机上,每行读取包含两个整数的500万行需要大约46秒,26秒,以及1秒多一点.pandasnumpy.loadtxtnumpy.genfromtxtpandas.read_csv

这是显示结果的会话.(这是在Linux上,Ubuntu 12.04 64位.你在这里看不到它,但在每次读取文件后,通过sync; echo 3 > /proc/sys/vm/drop_caches在单独的shell中运行来清除磁盘缓存.)

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
Run Code Online (Sandbox Code Playgroud)

  • 我打开了一个numpy问题:https://github.com/numpy/numpy/issues/3019.我无法想象,`loadtxt`这么慢是正常的. (2认同)

bmu*_*bmu 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
Run Code Online (Sandbox Code Playgroud)

因此pandas.read_csv,读取数据大约需要一秒半,比您的方法快10倍.


Udo*_*ein 0

最简单的加速方法是使用 PyPy http://pypy.org/

下一个问题是根本不读取文件(如果可能的话)。相反,像流一样处理它。