在加速Python时,有没有更好的方法来使用cython?

在加速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],

我有一个具有以下结构的大型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],
       ['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>
例如:

不需要cython(除非您确实需要复杂的元素计算)


由于您之前使用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]))