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

python中转换numpy数组中带格式数字的字符串的最快方法是什么,python,performance,numpy,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=行上。有没

我有一个很大的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程序中得到的要慢得多(见此,我已经实现了一个FORTRAN字符串处理器,并将其与f2py一起使用,但运行时只能与
data=
行相比较。我想Python/FORTRAN之间的I/O处理和类型转换扼杀了我从FORTRAN获得的东西)

既然我知道格式,那么使用
split()
难道不应该有更好更快的方法吗?比如:

data = readf(line,'(1000F20.10)')
我尝试了这个软件包,它运行得很好,但在我的例子中,它比使用
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
以及:

因此,在我的例子中,
fromstring
实际上稍微慢一点。

如果你能让它匹配你的输入格式,那么这个函数就是速度冠军

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

您尝试过吗


根据我的理解,
np.genfromtext
将尝试将整个文件读取到内存中,这在这种情况下是不可能的(文件大小约为100GB)。如果这是最快的方法,那将是令人伤心的。我不喜欢在我认为应该快速直接的事情上花费/浪费太多时间和CPU周期(即使用已知的格式代码)-但可能我太受FORTRAN的影响了。@Andre不需要将整个文件读入内存。您也可以使用as
fname
参数作为生成器,从一个简单的while循环中每行生成一行。是的,速度与
split()差不多
方法。我想要真正加快速度,格式代码必须是“本机”使用的。@root好的,我会再试一次,也许我遗漏了什么。您应该查看模块以测试这些小片段。
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
np.fromstring(line, dtype=np.float, sep=" ")