在加速Python时,有没有更好的方法来使用cython?
我有一个具有以下结构的大型numpy阵列:在加速Python时,有没有更好的方法来使用cython?,python,cython,numba,Python,Cython,Numba,我有一个具有以下结构的大型numpy阵列: array([['A', 0.0, 0.0], ['B2', 1.0, 0.0], ['B4', 2.0, 3.0], ['AX1', 3.0, 1.0], ['C2', 0.0, 2.0], ['D3', 2.0, 1.0], ['X4', 3.0, 8.0], ['BN', 2.0, 9.0], ['VF', 12.0, 25.0],
array([['A', 0.0, 0.0],
['B2', 1.0, 0.0],
['B4', 2.0, 3.0],
['AX1', 3.0, 1.0],
['C2', 0.0, 2.0],
['D3', 2.0, 1.0],
['X4', 3.0, 8.0],
['BN', 2.0, 9.0],
['VF', 12.0, 25.0],
['L', 1.0, 3.0],
...,
['s', 2.0, 27.0],
['P', 0.0, 0.0]], dtype=object)
我正在使用cython来尽量加快处理速度。下面代码中的参数数据集就是上面的数组
%%cython
cpdef permut1(dataset):
cdef int i
cdef int j
cdef str x
cdef str v
xlist = []
for i, x in enumerate(dataset[:,0]):
for j, v in enumerate(dataset[:,0]):
xlist.append((x,v,dataset[i][1], dataset[j][2]))
return xlist
但是,在使用cython和不使用cython运行上述代码时,我会得到以下时间:
不带cython:0:00:00.945872
与cython:0:00:00.561925
你知道我如何使用cython来加快速度吗
谢谢通常使用numpy时,您希望:
- 将相同的数据类型放入一个数组(避免dtype=object,并为字符串使用单独的数组)。否则,每个元素访问都必须对数据类型进行内部测试,这将减慢速度。这同样适用于cython
- 避免按元素访问,而只在整个阵列上使用操作。对于您的情况,请考虑在整数数组中建立索引,并将输入数组的索引表示为一个操作。< /P>
由于您之前使用O(n^2)操作进行了迭代,因此即使您首先必须将输入数组转换为这种格式,上述操作也会加速。
cdef str x
和v
可能会(稍微)使情况变得更糟。您根本不使用类型信息,所以您添加的只是一个无意义的类型检查。这可能对i
和j
也是如此;我不确定<代码>数据集[i][1]->数据集[i,1]
(由于它是一个操作,因此速度可能会更快)。对象数据类型数组只是美化(或降级?)列表。使用数组或可以轻松转换为c
的代码时,可以获得最佳的cython
速度提升。必须引用其他Python对象的列表和数组需要大量Python代码,即使在cython
中也是如此。有一种方法可以获得cython代码的带注释的html
显示。显示中的亮黄色表示Python粗线条。
a = np.array(..., dtype=np.float) # input number columns only from above
fa = a.flatten() # helps to use 1d indices
far = fa.reshape((fa.shape[0], 1)) # make 2d for hstack()
idxs = np.indices((a.shape[0], a.shape[0]))
idxs1 = idxs[0].flatten() # 0,0,0,1,1,1,...
idxs2 = idxs[1].flatten() # 0,1,0,1,...
np.hstack((far[idxs1], far[idx2]))