我正在尝试使用Cython加快我的Python代码的速度,到目前为止,它的运行情况很好。
但是,我有一个问题:处理列表。

使用cython -a myscript.pyx,我可以看到我的代码中唯一调用Python例程的部分是在处理列表时。

例如,我有一个numpy数组(sel1),我需要像这样拆分:

x1 = numpy.array([t[0] for t in sel1])
y1 = numpy.array([t[1] for t in sel1])
z1 = numpy.array([t[2] for t in sel1])

而且我不知道如何使用Cython加快速度。

另一个情况是使用列表/数组索引时,如下所示:
cdef numpy.ndarray[DTYPE_t, ndim=2] init_value_1 = coords_1[0], init_value_2 = coords_2[0]

我知道,花时间是用来访问我所需列表部分的Python例程。我目前不知道如何加快速度。

最佳答案

在Cython中操作列表本质上比使用numpy数组或类型化的内存视图更昂贵,因为前者需要进行Python API调用,而后者可以直接寻址底层的C内存缓冲区。避免这种开销的最好方法是尽可能地不使用列表。

无论如何,您实际上都不应该使用列表推导来拆分sel1数组-简单地索引到列中会更快:

x1 = sel1[:, 0]
x2 = sel1[:, 1]
x3 = sel1[:, 2]

在Cython中创建新的numpy数组总是会产生一些Python开销,因为它们在Python堆上分配并由Python的内存管理系统解决。如果coords1coords2listtuple而不是numpy数组,那么该行可能比需要的价格昂贵。

09-27 09:17