我有一个很大的 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 =
行中。有什么方法可以加快这条线的速度吗?另外,执行速度似乎比我从带有格式化读取的 native FORTRAN 程序中获得的速度慢得多(请参阅此 question ,我实现了一个 FORTRAN 字符串处理器并将其与 f2py 一起使用,但运行时间只能与data =
行。我猜 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
在我的例子中实际上稍微慢一些。
最佳答案
你试过吗numpyp.fromstring
?
np.fromstring(line, dtype=np.float, sep=" ")
关于python - python中将字符串与numpy数组中的格式化数字转换的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15920413/