パフォーマンスの問題からCythonを学び始めています。この特定のコードは、輸送モデリング(計画用)領域にいくつかの新しいアルゴリズムを実装する試みです。
私は、LOT(数億回)を使用し、パフォーマンスの向上から間違いなく恩恵を受けるという非常に単純な関数から始めることにしました。
この関数を3つの異なる方法で実装し、同じパラメーターについて(簡単にするために)それぞれ1,000万回テストしました。
CythonモジュールのCythonコード。実行時間:3.35秒
CythonモジュールのPythonコード。実行時間:4.88秒
メインスクリプトのPythonコード。実行時間:2.98秒
ご覧のとおり、cythonコードはcythonモジュールのpythonコードより45%遅く、メインスクリプトに記述されたコードより64%遅くなりました。そんなことがあるものか?どこを間違えているのですか?
Cythonコードは次のとおりです。
def BPR2(vol, cap, al, be):
con=al*pow(vol/cap,be)
return con
def func (float volume, float capacity,float alfa,float beta):
cdef float congest
congest=alfa*pow(volume/capacity,beta)
return congest
そして、テスト用のスクリプトは次のとおりです。
agora=clock()
for i in range(10000000):
q=linkdelay.BPR2(10,5,0.15,4)
agora=clock()-agora
print agora
agora=clock()
for i in range(10000000):
q=linkdelay.func(10,5,0.15,4)
agora=clock()-agora
print agora
agora=clock()
for i in range(10000000):
q=0.15*pow(10/5,4)
agora=clock()-agora
print agora
超越関数(パワー)が遅くなるなどの問題は承知していますが、問題になるとは思いません。
関数空間で関数を探すためのオーバーヘッドがあるので、関数の配列を渡して配列を取り戻した場合、パフォーマンスに役立ちますか?Cythonで記述された関数を使用して配列を返すことはできますか?
参考までに、私は以下を使用しています:
- Windows764ビット
- Python2.7.364ビット
- Cython0.1664ビット
- Windows Visual Studio 2008