【发布时间】:2015-05-02 10:15:44
【问题描述】:
我想做的——将我的纯 Python 代码转换成 Cython。
纯 Python 代码:
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 代码:
cdef char conflicts(int [] list1,int [] list2):
cdef int 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'没有缓冲区接口”。
【问题讨论】:
-
我对 cython 了解不多,但在常规 Python 中,您可以通过使用
set并进行交集(或一堆成员资格测试)而不是迭代来改进一些事情在所有成对的项目上找到匹配项。性能将是O(M+N)而不是O(M*N)。 -
用分析器测试性能怎么样?我假设你以前这样做过,所以你发现
confilcts不够快。因此,只需对 cython 版本执行相同操作即可。如果你没有配置文件,你怎么知道这个功能不够快?也许还有另一个更大的瓶颈需要处理……
标签: python performance optimization cython