2017-01-15 3 views
0

このコードの使用時間を短縮しようとしています。 私のコードは、2500株の指数移動平均(ema(データ、期間)関数として)を計算することです。このコードのパフォーマンスを上げる方法

input:: stock_data[name] = [x,x,x....] 
output:: ema[stockname][period] = [x,x,x....] 

私のコード:

stock_names = ['ABC',...] #2500 name 
ema_periods = [5, 10, 11, 12, 13, 14, 15, 16, 20, 25, 30, 35, 40, 45, 50, 75, 90, 100, 200] #19 periods 

# get data 
stock_data = dict() 
for name in stock_names: 
    stock_data[name] = get_stock_data(name) #each name keep 2000 values 

start = time.time() 
ema_dict = dict((key, dict((period, ema(stock_data[key], period)) for period in ema_periods)) for key in stock_data.keys()) 
print('elasped : ', time.time()-start) 

私はそれを10回

AVGを実行しています。時間はelasped = 17.60秒

は、私は、データが嘲笑されるのデータは、それがより良い方法を持っていないので、提案は唯一

ema_dict = dict((key, dict((period, ema(stock_data[key], period)) for period in ema_periods)) for key in stock_data.keys()) 

で私のパフォーマンスを向上させたいです。

ありがとうございます。

+4

私は、パフォーマンスのボトルネックを考えますおそらくこのコードではなく 'get_stock_data(..)'や 'ema(..)'となります。 –

+4

'get_stock_data'と' ema'とは何ですか? – fuglede

答えて

0

コメントに記載されているように、私たちはすべてのルーチンにアクセスすることはできませんが、ここでは高速化することができます。

  • 生成者の理解の代わりにdictの理解を使用して、dictに供給するためのタプルを発行します。 tupleの作成には時間がかかります。ここに2つの潜在的なdict compがあります。
  • stock_data辞書をキーで毎回アクセスしません。あなたは

キーと値私の提案で繰り返すことができます:

ema_dict = {key : {period: ema(value, period) for period in ema_periods} for key,value in stock_data.items()} 

と同じ原理を、以下、最初のinitループは次のように記述できます。

stock_data = {name:get_stock_data(name) for name in stock_names} 
関連する問題