Python numpy.loadtxt比open慢很多…..readlines()

Python numpy.loadtxt比open慢很多…..readlines(),python,numpy,Python,Numpy,当比较这两种做同样事情的方法时: import numpy as np import time start_time = time.time() for j in range(1000): bv=np.loadtxt('file%d.dat' % (j+1)) if(j%100==0): print bv[300,0] T1=time.time() - start_time print("--- %s seconds ---" % T1) 及 我注意到第

当比较这两种做同样事情的方法时:

import numpy as np
import time
start_time = time.time()
for j in range(1000):
    bv=np.loadtxt('file%d.dat' % (j+1))
    if(j%100==0):   
        print bv[300,0] 
T1=time.time() - start_time
print("--- %s seconds ---" % T1)

我注意到第二个要快得多。有没有什么方法可以像第一种方法一样简洁,像第二种方法一样快?
为什么loadtxt在手动执行同一任务时速度如此之慢?

创建了一个简单但不太大的csv,它使用:

In [898]: arr = np.ones((1000,100))
In [899]: np.savetxt('float.csv',arr)
loadtxt版本:

In [900]: timeit data = np.loadtxt('float.csv')
112 ms ± 119 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
fromfile
可以加载文本,但不会保留任何形状信息(没有明显的速度优势)

我能想到的“手册”的最简明版本是:

In [902]: %%timeit
     ...: with open('float.csv') as f:
     ...:     data = np.array([line.strip().split() for line in f],float)
52.9 ms ± 589 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
这比
loadtxt
提高了2倍,似乎是这方面典型的变化

pd.read\u csv
大约在同一时间

genfromtxt
loadtxt
快一点:

In [907]: timeit data = np.genfromtxt('float.csv')
98.2 ms ± 4.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

顺便说一句,你可以使第二个版本更快,使用更少的内存。无需将整个文件加载到带有
.readlines
的列表中,您可以直接在这些行上循环。例如,
用于a:
中的行。但是,即使您确实希望在列表上进行迭代,也最好直接在列表项上循环,而不是与列表索引混淆。这为您提供了更干净、更快的代码,因为您可以执行类似于
row=row.rstrip('\n').split('\t')
的操作。① ② ③
loadtxt
是Python代码;没有特别编译过。它逐行读取文件,拆分、部分解析这些行,并在列表列表中收集数据。然后在最后构建一次数组
genfromtxt
与之类似,但使用了更复杂的行和数据类型处理。它工作得很好,但是我必须使用一个额外的命令来切换到数组类型,即file=file.values
In [902]: %%timeit
     ...: with open('float.csv') as f:
     ...:     data = np.array([line.strip().split() for line in f],float)
52.9 ms ± 589 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [907]: timeit data = np.genfromtxt('float.csv')
98.2 ms ± 4.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)