计算两个列表的交集时如何避免附加?

时间:2018-08-02 13:15:01

标签: cython

我正在编写一个函数来计算两个排序数组(可能包含重复项)之间的交集。因此,如果输入为[0,3,7,7,7,9,12]和[2,7,7,8,12],则输出应为[7,7,12]。

这是我的代码:

0x69

正如您将看到的,我使用一个列表来存储答案,并在到达时追加添加答案。如果可以加快速度,我很高兴返回python或numpy数组。

  

如何避免添加附件以加快cython的速度?

1 个答案:

答案 0 :(得分:3)

对于这种事情,您通常要预分配数组(以后可以随意缩小数组)。在这种情况下,它的长度不能超过您输入数组中最短的长度,因此可以为您提供一个起始大小:

cdef int[::1] intersect = np.array([A.shape[0] if A.shape[0]<B.shape[0] else B.shape[0]],dtype=np.int)

然后,您只需保持运行状态即可得知该数组上的索引(例如k),因此append被替换为:

intersect[k] = A[i]
k += 1

最后,您可以返回memoryview intersect[:k]或使用np.asarray(intersect[:k])将其转换为numpy数组。


顺便说一句:由于您不进行任何除法,因此我将删除Cython指令@cython.cdivision(True)。我相信您应该考虑这些指令是否有用,以及它们是否适用于您的代码,而不是出于习惯而盲目地复制它们。

相关问题