python中使用numpy数组转换格式化数字的字符串的最快方法是什么

时间:2013-04-10 08:14:26

标签: python performance numpy

我有一个大的ASCII文件(~100GB),它包含大约1.000.000行的已知格式化数字,我尝试使用python进行处理。该文件太大而无法完全读入内存,因此我决定逐行处理该文件:

fp = open(file_name)
for count,line in enumerate(fp):
    data = np.array(line.split(),dtype=np.float)
    #do stuff
fp.close()

事实证明,我将程序的大部分运行时间花在了data =行。有没有办法加快这条线?此外,执行速度似乎比我从具有格式化读取的本机FORTRAN程序获得的速度慢得多(参见此question,我已实现FORTRAN字符串处理器并将其与f2py一起使用,但运行时间仅为与data =行相当。我猜Python / FORTRAN之间的I / O处理和类型转换会杀死我从FORTRAN获得的内容)

因为我知道格式化,所以不应该有更好,更快的方式来使用split()吗?类似的东西:

data = readf(line,'(1000F20.10)')

我尝试了fortranformat包,效果很好,但在我的情况下比split()方法慢三倍。

P.S。正如ExP和root所建议的那样,我尝试了np.fromstring并制定了这个快速而污秽的基准:

t1 = time.time()
for i in range(500):
  data=np.array(line.split(),dtype=np.float)
t2 = time.time()    
print (t2-t1)/500
print data.shape
print data[0]
0.00160977363586
(9002,)
0.0015162509

t1 = time.time()
for i in range(500):    
   data = np.fromstring(line,sep=' ',dtype=np.float,count=9002)
t2 = time.time()
print (t2-t1)/500
print data.shape
print data[0]
0.00159792804718
(9002,)
0.0015162509

所以fromstring实际上在我的情况下稍慢。

2 个答案:

答案 0 :(得分:2)

您是否尝试过numpyp.fromstring

np.fromstring(line, dtype=np.float, sep=" ")

答案 1 :(得分:1)

np.genfromtxt功能是一个速度冠军,如果你可以让它匹配你的输入格式。

如果没有,那么您可能已经在使用最快的方法。您的逐行拆分数组方法与SciPy Cookbook examples完全匹配。