Cythonを使って効率的にPythonコードをコンパイルしてより速くする方法を学習しています。Cython:.pydファイルをインポートするとエラーが返されます(init関数が不足しています)
- は私が
math_code_python.py
というPythonファイルを作成し、その中で4つの単純な関数を置く:ここは、私がこれまで行ってきたものです。
- このファイルを
math_code_cython.pyx
という名前で保存しました。 setup.py
というセットアップファイルを作成しました。Command Prompt
にpython C:\Users\loic\Documents\math_code\setup.py build_ext --inplace
と入力しました。math_code_cython.cp36-win_amd64.pyd
という名前のコンパイル済みファイルがあり、これをmath_code_pyd.pyd
という名前に変更しました。最後に、だけを持つ
test_math_code.pyd
と呼ばれるPythonファイルを作成しました。- https://bytes.com/topic/python/answers/694888-constructor-initialization-function-module
- Python 3.5 ImportError: dynamic module does not define module export function (PyInit_cv2):私は私が
init function
を提供しなければならなかったことを理解これらの記事にいくつかの研究と感謝をしたImportError: dynamic module does not define module export 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
setup.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"),
)