16

パフォーマンスの問題から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
4

3 に答える 3

3

テストは以下を使用して行われました:

for i in range(10000000):
  func(2.7,2.3,2.4,i)

結果は次のとおりです。

cdef float func(float v, float c, float a, float b):
  return a * (v/c) ** b
#=> 0.85

cpdef float func(float v, float c, float a, float b):
  return a * (v/c) ** b
#=> 0.84

def func(v,c,a,b):
  return a * pow(v/c,b)
#=> 3.41

cdef float func(float v, float c, float a, float b):
  return a * pow(v/c, b)
#=> 2.35

最高の効率を得るには、C で関数を定義し、戻り値の型を静的にする必要があります。

于 2012-06-25T19:14:11.477 に答える
1

この関数は次のように最適化できます (python と cython の両方で、中間変数を削除する方が高速です)。

def func(float volume, float capacity, float alfa,f loat beta):
    return alfa * pow(volume / capacity, beta)
于 2012-06-25T18:11:29.293 に答える
1

Cython が遅い場合、それはおそらく型変換が原因であり、型注釈の欠如によって悪化している可能性があります。また、Cython で C データ構造を使用すると、Cython で Python データ構造を使用するよりも高速になる傾向があります。

CPython 2.x (Cython の有無、psyco の有無)、CPython 3.x (Cython の有無)、Pypy、および Jython のパフォーマンスを比較しました。少なくとも調べたマイクロベンチマークでは、Pypy が群を抜いて最速でした: http://stromberg.dnsalias.org/~strombrg/backshift/documentation/performance/

于 2012-06-25T19:14:19.163 に答える