2

我正在学习如何使用 Cython 高效地编译 Python 代码并使其更快。

这是我到目前为止所做的:

  1. 我创建了一个名为的 Python 文件math_code_python.py,并在其中放入了 4 个简单的函数。
  2. 我将该文件保存为math_code_cython.pyx.
  3. 我创建了一个名为setup.py.
  4. 我输入python C:\Users\loic\Documents\math_code\setup.py build_ext --inplace了我的Command Prompt.
  5. 我得到了一个名为math_code_cython.cp36-win_amd64.pyd我重命名的编译文件math_code_pyd.pyd
  6. 最后,我创建了一个 Python 文件test_math_code.pyd,只import math_code_pyd在其中调用了 with。当我执行这个文件时,我收到了这条消息:

    ImportError: dynamic module does not define module export function
    

我做了一些研究,感谢那些帖子,我明白我必须提供init function

我的问题是:我该怎么做?我是否必须在末尾添加一个函数,math_code_python.py如下所示?

def __init__(self):
    # something ?

我的 Python 版本:

Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)]

math_code_python.py

def fact(n):
    if n==0 or n==1:
        return 1
    else:
        return n*fact(n-1)

def fibo(n):
    if n==0 or n==1:
        return 1
    else:
        return fibo(n-1)+fibo(n-2)

def dicho(f, a, b, eps):
    assert f(a)*f(b) < 0
    while b-a > eps:
        M = (a+b)/2.
        if f(a) * f(M) > 0:
            a = M
        else:
            b = M
    return M

def newton(f, fp, x0, eps):
    u = x0
    v = u - f(u)/fp(u)
    while abs(v-u) > eps:
        u = v
        v = u - f(u)/fp(u)
    return v

安装程序.py

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

from Cython.Distutils import build_ext
from Cython.Build import cythonize

import numpy as np

setup(name = "maido",
      include_dirs = [np.get_include()],
      cmdclass = {'build_ext': build_ext},
      ext_modules = cythonize(r"C:\Users\loic\Documents\math_code\math_code_cython.pyx"),
      )
4

1 回答 1

1

您的错误是重命名 pyd 文件。当您调用import math_code_pyd它时,它会专门查找initmath_code_pyd(Python2) 或PyInit_math_code_pyd(Python3)。

当您使用 Cython 编译它时,它会生成一个与 .pyx 文件名(即initmath_code_cythonPyInit_math_code_cython)匹配的函数。因此它没有找到它期望的功能。您不必自己提供此功能 - Cython 会生成它。

只需将 .pyx 文件命名为您希望调用模块的名称,不要重命名 .pyd 文件。(原则上你可以删除它,.cp36-win_amd64但它很有用,而且是有原因的)。

于 2017-06-27T18:58:19.727 回答