2016-11-24 5 views
1

私はcythonの実際の動作を理解しようとしています。一番最初、私はCythonを使用して生成されたCコードのC関数を確認します。

from distutils.core import setup 
from Cython.Build import cythonize 

setup(ext_modules = cythonize("test.pyx")) 

後、私のようにコマンドラインからtest.pyxを実行し、setup.pyファイルにこのコードをラップし、

import numpy as np 
a=2;b=3; 
np.sum(a,b) 
np.subtract(a,b) 

を含むtest.pyxファイルを書かれています、

python setup.py build_ext --inplace 

このコマンドは、test.cコードを生成します。生成されたCコードは本当に大きく、理解するのが難しいです。ここで、np.sum(a、b)の実装がどこにあるか知りたいだけです。もし私がPythonをC言語に翻訳したのであれば、の和関数を他のCコードの独立関数として使うことができます。この関数には、それに沿ってコピーする必要のある依存関係がありますか?

良い回答を楽しみにしています。

ご意見ありがとうございます。私は何を参照してくださいhtmlファイルを見た後のように見える、

+06: import numpy as np 
__pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 6, __pyx_L1_error) 
__Pyx_GOTREF(__pyx_t_1); 
if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 6, __pyx_L1_error) 
__Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; 

これは__pyx_n_s_numpyモジュールを呼び出していることを意味します。 Cコンパイラはどのようにしてこのモジュールを実行できますか?私はこのモジュールの実装が.py形式であると思います。

+1

1)あなたのCythonコードは 'numpy.sum'のコードを生成しません。単に既存の関数を呼び出します。 2) 'cython -a filename'を呼び出すと、CythonコードがどのようなCコードに変換されるのかを示すアノテートされたhtmlが得られます。 – DavidW

答えて

2

You can run cython -a test.pyxとなり、生成されたHTMLで生成されたHTMLとともに、生成されたCコードでアノテーションされた各Cythonコード行が開きます。

この主な目的は、不要なPython呼び出しを排除してコードを最適化するのに役立ちます。そのため、Pythonランタイムとのやりとりが多い行が強調表示されます。

自分自身のCython初心者として、私はその有用性を誇張することはできません。上記の「主な目的」、当たりとしては、それが直接ソース線に相当する部分の外側に定型コードを含まないこと

注意。生成されたページの生のCへのリンクを使用してそれを確認します。

  • など。 __pyx_n_s_numpyは、"numpy"文字列を保持するPyObjectです。検索でわかるように、CythonはPythonランタイムに渡す必要のあるすべての文字列定数の初期化時にこれらを作成します。 __Pyx_Import()は、組み込み関数__import__をラップする自動生成された関数です。

幸いにも(= Cythonの著者に感謝します)、自動生成された名前は非常に説明的なので、実際にはそれらを探す必要はほとんどありません。ほとんどの場合、エンティティが何であるか/推測できます。また、Cythonで自動生成されたエンティティには、それらを区別するための接頭辞が付いています。 Python C APIのものです。

+0

提案をありがとう、私の更新を見てください:) –

+1

@SulabhTiwari更新を参照してください –

関連する問題