我有一个很大的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一起使用,但运行时间仅与数据相当=行.我猜想Python / FORTRAN之间的I / O处理和类型转换会杀死我从FORTRAN中获得的收益)
既然我知道格式,难道不应该有一种更好和更快的方式来使用split()吗?就像是:
data = readf(line,'(1000F20.10)')
我尝试了fortranformat程序包,该程序效果很好,但就我而言,它的速度比split()方法慢了三倍.
附:根据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实际上对我来说稍微慢一些.