我有一个大的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
实际上在我的情况下稍慢。
答案 0 :(得分:2)
您是否尝试过numpyp.fromstring
?
np.fromstring(line, dtype=np.float, sep=" ")
答案 1 :(得分:1)
np.genfromtxt功能是一个速度冠军,如果你可以让它匹配你的输入格式。
如果没有,那么您可能已经在使用最快的方法。您的逐行拆分数组方法与SciPy Cookbook examples完全匹配。