我正在尝试加速一个python3函数,它接受一些数据,这是一个索引数组,如果它们符合某个标准就会保存它们。我试图通过使用“cython -a script.py”来加速它,但瓶颈似乎是h5py I / O切片数据集。
我对cython比较陌生,所以我想知道是否还有提高速度,或者我只是受到h5py I / O的限制?
以下是我正在努力改进的功能:
{{1}}
答案 0 :(得分:2)
如此处所述:http://api.h5py.org/,h5py
使用cython
代码与HDF5
c
代码进行交互。因此,您自己的cython
代码可能可以直接访问该代码。但我怀疑这需要更多的研究。
您的代码使用的是h5py
的Python界面,cythonizing
不会触及它。
cython
代码最适用于低级操作,尤其是不能表示为数组操作的迭代操作。首先研究和试验numpy
示例。你正潜入游泳池深处的cython
。
您是否尝试使用Python和numpy改进代码?一眼就看出我看到了很多冗余的h5py
电话。
====================
你的radial
计算可以访问h5py
索引6次,当它可以用2进行时。也许你是这样编写的,希望cython
比numpy更快地执行以下计算?
data = grp['HaloCatalog']
progen = data[progen_haloid-1, 6:9]
host = data[host_id-1, 6:9]
radial = np.sqrt((progren-host)**2).sum(axis=1))
为什么不加载所有data[progen_haloid-1,:]
和data[host_id-1,:]
?甚至全部data
?我必须检查h5py
何时切换到直接使用文件上的数组以及何时成为numpy
数组。在任何情况下,内存中数组的数学运算都会比文件读取快得多。