Python中读取输入的最快方法

Python中读取输入的最快方法,python,input,python-3.x,readfile,Python,Input,Python 3.x,Readfile,我想读一个包含整数列表的巨大文本文件。 现在我正在做以下工作: G = [] with open("test.txt", 'r') as f: for line in f: G.append(list(map(int,line.split()))) 但是,它需要大约17秒(通过timeit)。有没有办法减少这一时间?也许,有一种方法不使用map。最简单的加速方法是使用PyPy 下一个问题是根本不读取文件(如果可能)。相反,要像处理流一样处理它。列表理解通常更快 G =

我想读一个包含整数列表的巨大文本文件。 现在我正在做以下工作:

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

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

最简单的加速方法是使用PyPy


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

列表理解通常更快

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

除此之外,请尝试PyPy、Cython和numpy。您还可以尝试通过大容量插入将数据引入数据库,然后使用set操作处理记录。根据您必须执行的操作,这可能会更快,因为批量插入软件针对这类任务进行了优化

作为一般经验法则(对于任何语言),使用
read()
读取整个文件要比一次读取一行快。如果不受内存限制,请立即读取整个文件,然后在换行符上拆分数据,然后迭代行列表

numpy具有函数
loadtxt
genfromtxt
,但两者都不是特别快。在广泛分布的库中,最快的文本阅读器之一是
pandas
()中的
read\u csv
功能。在我的电脑上,使用
numpy.loadtxt
读取每行包含两个整数的500万行大约需要46秒,使用
numpy.genfromtxt
读取26秒,使用
pandas.read\u csv
读取一秒多一点

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

基于
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\u csv
读取数据大约需要一秒半的时间,速度大约是您的方法的10倍。

尝试列表理解。有什么理由不在这里使用
numpy
吗?定义“巨大”。另外,每一行的整数数量是否相同?@WarrenWeckesser在这个例子中,实际上有相同数量的整数,两个元素。巨大的>5M行。
G=[map(int,line.split())用于f中的行]
更快。@StevenRumbalski这行生成的映射对象:
[,…
。但是@forivall line可以工作。@BranAlgue.Aha!您使用的是Python 3。所以将其更改为
G=[list(map(int,line.split())用于f中的行]
。它仍然比嵌套列表理解快。这很奇怪@StevenRumbalski,因为您的行运行缓慢:
stmt=''带open(“SCC.txt”,“r”)为f:G=[list(map(int,line.split()),用于f]'''test1=timeit.timeit(stmt,number=1)stmt=''带open(“SCC.txt”,“r”)为f:G=[[int(item)对于第.split()行中的项,对于f]''中的行,test2=timeit.timeit(stmt,number=1)
>>test1 16.291107619840908>>test2 11.386214308615607
有可能是Python 3改变了listcomps的性能。概述这一点的老问题:+1,在我准备我的问题时没有看到你的答案。我也只是对OP的版本进行了基准测试,在我的机器上大约需要16秒。我还注意到,
loadtxt的速度很慢。我不知道为什么,我希望它会更快(它应该比
genfromtxt
快。你也使用numpy 1.7吗?@bmu:是的,我使用了numpy 1.7。我打开了一个numpy问题:。我无法想象,
loadtxt
这么慢是正常的。@BranAlgue:Christoph Gohlke通过准备和托管numpy的二进制版本为Python社区提供了巨大的服务(和许多其他软件包)用于Windows。看看:嘿,@WarrenWeckesser它很有帮助。它读取文件,但执行此操作需要大约一分钟的时间,而且数字是浮点型的,这是不对的。不幸的是,Python 3.3没有熊猫。也许要在3.2上重新安装?
# 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