将python类转换为cython

2024-10-02 14:27:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写了以下代码:

class DisjointSet:
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [0 for x in range(n)]

    def find(self, v):
        if v != self.parent[v]:
            self.parent[v] = self.find(self.parent[v])
        return self.parent[v]

其余的代码在“代码复杂度”方面是相似的,不包括在这里。在

<>我想把上面的代码翻译成Cython代码(我知道一点点C++,我设法把我的代码翻译成C++,但是我想试试Cython,看看它和C++和Python相比如何)。我有这样的东西:

在分离集.pyx公司名称:

^{pr2}$

在设置.py公司名称:

^{3}$

我在WindowsPowerShell中运行python setup.py build_ext --inplace来编译代码。但是,当我导入代码并在Python中尝试时,它有时会给出错误(process不返回0),有时在我调用find方法时会给出RecursionError。那么正确的翻译方法是什么呢?我已经阅读了官方文档,但是对于cdefcpdef之类的东西我还是不太确定。在

编辑:我已经添加了for循环来解决这个问题,但是我应该如何改进cython代码?当我查看生成的html文件时,仍然有许多黄色的突出显示(python交互)。具体来说,我想问一下我应该如何使用^ {CD2}},^ {< CD3}}使类方法(^ {< CD6> })更像C++代码。在


Tags: 方法代码pyself名称forinitdef
1条回答
网友
1楼 · 发布于 2024-10-02 14:27:23

C++ +{}运算符{{CD2>}{a1},越界访问给出了一个随机值,这导致后续向量访问中的段错误,您将注意到非零退出代码。

相反,使用^{cd3>},which has bounds checking,cyton将^{cd4>}异常转换为^{cd5>}:

 def find(self, int v):
     try:
         pv = self.parent.at(v)
     except IndexError:
         return None
     ...

相关问题 更多 >