我正在尝试使用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的内存管理系统解决。如果
coords1
或coords2
是list
或tuple
而不是numpy数组,那么该行可能比需要的价格昂贵。