当比较这两种做同一件事的方式时:
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):
a=open('file%d.dat' % (j+1),'r')
b=a.readlines()
a.close()
for i in range(len(b)):
b[i]=b[i].strip("\n")
b[i]=b[i].split("\t")
b[i]=map(float,b[i])
bv=np.asarray(b)
if(j%100==0):
print bv[300,0]
T1=time.time() - start_time
print("--- %s seconds ---" % T1)
我注意到第二个要快得多。有什么方法可以像第一种方法一样简洁,第二种方法一样快捷? 为什么loadtxt在手动执行相同任务方面如此缓慢?
答案 0 :(得分:1)
使用创建的简单但不太大的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 [901]: timeit data = np.fromfile('float.csv', dtype=float, sep=' ').reshape(-1,100)
129 ms ± 1.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
我能想到的最简明的“手册”版本:
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_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)