掲示板 - Python技術 - cython能提升文件读取速度吗?

cython能提升文件读取速度吗?
styr 2014/08/09

我有一些二进制数据文件,大小在1G到12G之间,里面存放的是数组。

我用的是服务器,内存够大,一次性读入后再处理是值得的。

目前我使用np.fromfile读入,磁盘IO速度是个瓶颈。

用c读入速度似乎就要快很多(为什么?),cython在这方面跟c会比较接近吗?

如果是就考虑用cython重写IO部分的代码了。

我知道应该自己去写代码测试下,不过还是想先问问若愚兄的意见。谢谢啦。

RY 2014/08/09

能把fromfile和C语言的代码贴一下吗?我觉得如果是二进制数据,二者应该没有什么差别。你确定真的差别很大?不是操作系统的缓存因素? 如果真的有差别,那么用Cython应该能提高速度,因为可以用Cython直接把你编写的C语言读数据的函数包装一下即可。

styr 2014/08/11

谢谢回复。我去测试下,到时再把结果帖过来吧。

styr 2014/08/17

numpy 和 cython 的读文件比较代码,我用ipython notebook运行的。

01%%cython
02from libc.stdio cimport fopen, fread, fclose, FILE
03from libc.stdlib cimport malloc, free
04import numpy as np
05cimport numpy as np
06cimport cython
07
08@cython.boundscheck(False)
09@cython.wraparound(False)
10def read_cython(char *fn, size_t n):
11    cdef:
12        float[:] b=np.empty(n/4,'f4')
13        FILE *fp
14    fp=fopen(fn,'r')
15    n=fread(&b[0],1,n,fp)
16    return np.asarray(b)

750M文件

1%timeit -n 1 -r 1 a=fromfile(fn, count=n//4)
2#1 loops, best of 1: 1.89 s per loop
3%timeit -n 1 -r 1 a=read_cython(fn,n)
4#1 loops, best of 1: 966 ms per loop

6G文件

1%timeit -n 1 -r 1 a=fromfile(fn, count=n//4)
21 loops, best of 1: 17.6 s per loop
3%timeit -n 1 -r 1 a=read_cython(fn,n)
41 loops, best of 1: 7.94 s per loop

可以看到两者速度几乎相差一倍。

styr 2014/08/18

更正:之前的代码有问题,没有指定fromfile的类型,改用`a=fromfile(fn,'f4', count=n//4)`之后,两者速度相当。

HY 2014/08/18

是不是你指定的读入的字节数n没有将整个文件读完?因此当dtype为缺省的双精度浮点数类型时,所读入的字节数要多一倍。是读完整个文件的话,那么float64和float32应该也没有速度区别吧。

loading...