python - python中将字符串与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 = 行中。有什么方法可以加快这条线的速度吗?另外,执行速度似乎比我从带有格式化读取的 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/

相关文章:

MySQL没有使用复合索引的所有关键部分

python - 向量中的三重 for 循环

python - 将 `numpy.linalg.det` 作为方法添加到 `numpy.matrix`

python - 无法使用 FileResponse 或 StreamingHttpResponse 渲染 base64 文件,但可以使用 HttpResponse

python - nltk.trigams 没有 count 属性

python - 如何使用python编程将一组DNA序列转换成蛋白质序列?

python - 如何展平全部包含字符串的嵌套 IF 语句?

java - 用java代码下载真的很慢

java - Scala 的 loop-react 性能太差了。为什么?

csv - genfromtxt dtype=None 返回错误的形状