Cython:简单的功能有2个列表,最快的方法是什么?

时间:2015-05-02 10:15:44

标签: python performance optimization cython

我想做什么 - 将我的纯Python代码转换为Cython。

纯Python代码:

ToolTip

到目前为止,我的Cython代码:

def conflicts(list1,list2):
    numIt = 10
    for i in list1:
        for j in list2:
            if i == j and i < numIt:
                return True
    return False
conflicts([1,2,3], [6,9,8])

由于我是Cython的新手(而不是Python中的专业人士),我想得到一些有关我的转换的反馈。我做对了吗?为了使功能更快,还有什么我应该做的吗?

更新

有谁知道我如何在输入的函数标题中添加类型(list1,list2)?我尝试了“int [:]”编译没有错误,但当我尝试用两个列表调用函数时,我收到消息“TypeError:'list'没有缓冲区接口”。

1 个答案:

答案 0 :(得分:0)

正如我评论的那样,你应该能够通过改变你的算法获得相当大的改进,而根本不会搞乱cython。您当前的代码为O(len(list1)*len(list2)),但您可以使用O(len(list1)+len(list2))将此代码缩减为set。您还可以使用内置any函数简化代码:

def conflicts(list1,list2):
    numIt = 10
    s1 = set(list1)
    return any(x in s1 and x < numIt for x in list2)

根据每个列表中您希望小于10的数量,您可以尝试稍微移动x < numIt测试以查看最快的数据(过滤list1然后再将其转换为例如,set或将if x < numIt放在forany内的生成器表达式中。{/ p>