numpy.loadtxt比打开慢..... readlines()

时间:2018-09-08 06:10:00

标签: 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):
    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在手动执行相同任务方面如此缓慢?

1 个答案:

答案 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大约是同一时间。

genfromtxtloadtxt快一点:

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)