我可以将我的Cython代码转换为Python吗?

时间:2017-12-07 04:32:25

标签: python cython

我编写了一个cython代码来帮助弥合第三方库和python之间的差距。

我还在cython中编写了一些代码以改善其性能。

我可以将上述两个用例转换为原始python吗?

用例1的示例

def f(double x):
    return x**2-x

def integrate_f(double a, double b, int N):
    cdef int i
    cdef double s, dx
    s = 0
    dx = (b-a)/N
    for i in range(N):
        s += f(a+i*dx)
    return s * dx

用例2的例子

from libc.stdlib cimport atoi

cdef parse_charptr_to_py_int(char* s):
    assert s is not NULL, "byte string value is NULL"
    return atoi(s)   # note: atoi() has no error detection!

1 个答案:

答案 0 :(得分:2)

首先使用案例,答案是肯定的。 您需要做的只是删除cdef行。

def f(double x):
    return x**2-x

def integrate_f(double a, double b, int N):
    s = 0
    dx = (b-a)/N
    for i in range(N):
        s += f(a+i*dx)
    return s * dx

对于您的第二个用例,因为您无法删除cdef行或将cdef重命名为def,因此事情变得棘手。此外,由于此用例取决于外部库,因此它不直接进行python转换。

除了Cython,您还可以使用2个选项。

  • ctypes - 内置于标准python中的外部函数库
  • cffi - 一个与ctypes类似的库,但简化了库粘合代码。

使用ctypes的使用示例如下所示

def parse_charptr_to_py_int(test):
    from ctypes import cdll,c_char_p
    cdll.LoadLibrary("libc.so")
    return cdll.libc.atoi(c_char_p(test))

使用cffi的用法示例如下所示

def parse_charptr_to_py_int(test):
    from cffi import FFI
    ffi = FFI()
    ffi.cdef("int atoi(const char *str);")
    CLib = ffi.dlopen("libc.so")
    return CLib.atoi(test)