ここからリストの最も近い有効なオッズに値を丸める関数を作成しようとしています: https://api.developer.betfair.com/services/webapps/docs/display/1smk3cen4v3lu3yomq5qye0ni/Betfair+Price+Increments
私のコードはここにあります:
def nclosest_valid_odds( x ):
"""
https://api.developer.betfair.com/services/webapps/docs/display/1smk3cen4v3lu3yomq5qye0ni/Betfair+Price+Increments
"""
r = np.empty_like( x )
r[ x<1.0 ] = np.nan
bidx = (1.0<=x) & (x<=2.0)
r[ bidx ] = 0.01 * np.round( x[ bidx ] / 0.01 )
bidx = (2.0<x) & (x<=3.0 )
r[ bidx ] = 0.02 * np.round( x[ bidx ] / 0.02 )
bidx = (3.0<x) & (x<=4.0)
r[ bidx ] = 0.05 * np.round( x[ bidx ] / 0.05 )
bidx = (4.0<x) & (x<=6.0)
r[ bidx ] = 0.1 * np.round( x[ bidx ] / 0.1 )
bidx = (6.0<x) & (x<=10.0)
r[ bidx ] = 0.2 * np.round( x[ bidx ] / 0.2 )
bidx = (10.0<x) & (x<=20.0)
r[ bidx ] = 0.5 * np.round( x[ bidx ] / 0.5 )
bidx = (20.0<x) & (x<=30.0)
r[ bidx ] = np.round( x[ bidx ] )
bidx = (30.0<x) & (x<=50.0)
r[ bidx ] = 2.0 * np.round( x[ bidx ] / 2.0 )
bidx = (50.0<x) & (x<=100.0)
r[ bidx ] = 5.0 * np.round( x[ bidx ] / 5.0 )
bidx = (100.0<x) & (x<=1000)
r[ bidx ] = 10.0 * np.round( x[ bidx ] / 10.0 )
return r
numba を使用したフロア バージョンは次のとおりです。
def floor_closest_valid_odds( x ):
r = np.zeros_like( x )
for i in range( len( r ) ):
if x[i]<=1.0:
r[i] = np.nan
elif x[i]<=2.0:
r[i] = 0.01 * np.floor( x[i] / 0.01 )
elif x[i]<=3.0:
r[i] = 0.02 * np.floor( x[i] / 0.02 )
elif x[i]<=4.0:
r[i] = 0.05 * np.floor( x[i] / 0.05 )
elif x[i]<=6.0:
r[i] = 0.1 * np.floor( x[i] / 0.1 )
elif x[i]<=10.0:
r[i] = 0.5 * np.floor( x[i] / 0.5 )
elif x[i]<=20.0:
r[i] = 1.0 * np.floor( x[i] / 1.0 )
elif x[i]<=30.0:
r[i] = 2.0 * np.floor( x[i] / 2.0 )
elif x[i]<=50.0:
r[i] = 2.0 * np.floor( x[i] / 2.0 )
elif x[i]<=100.0:
r[i] = 5.0 * np.floor( x[i] / 5.0 )
elif x[i]<=1000.0:
r[i] = 2.0 * np.floor( x[i] / 2.0 )
else:
r[i] = 1000.0
return r
jfloor_closest_valid_odds = autojit( floor_closest_valid_odds )
そして、これを使用してコードの時間を計ります:
x = np.random.randn( 1000000 )
with Timer( 'nclosest_odds' ):
r = nclosest_valid_odds( x )
r =helpers.jfloor_closest_valid_odds( x )
with Timer( 'jfloor_closest_valid_odds' ):
r = helpers.jfloor_closest_valid_odds( x )
私のマシンのタイミング:
nclosest odds : 0.06 seconds
jfloor_closest_odds : 0.01 seconds
numpy や numba を使用してコードを高速化するにはどうすればよいですか?
解決:
http://numba.pydata.org/numba-doc/dev/examples.htmlのマルチスレッドの例をベクトル化関数に変換できることを発見しました。これを使用すると、2 コアのラップトップで最高のパフォーマンスが得られます。
Numba の Vectorize 関数も、それほど良くはありませんが、問題ありません。
ベクトライザー コードを github にアップロードしました: https://github.com/jsphon/MTVectorizer
タイミング比較のチャートを以下に示します。x 軸は、入力配列のサイズを表します。y 軸は時間を表します。
このグラフは、デュアル コア ラップトップのものです。
このグラフは、i7 920 CPU を搭載したデスクトップのものです。8コアあります。