2016-05-17 163 views
2

我有以下代碼優化方法

def calculate_metrics 
    reach_values = {} 
    reach_values['reach_change_value'] = 0 
    reach_values['reach_change_type'] = 'nochange' 

    if find_yesterdays_metrics 
     change = (get_influencer_metrics["total_count"]).to_i - find_yesterdays_metrics.reach_count 
     reach_values['reach_change_value'] = change.abs 

     case 
     when change < 0 
      reach_values['reach_change_type'] = "down" 
     when change > 0 
      reach_values['reach_change_type'] = "up" 
     end 
    end 

    reach_values 
    end 

def set_metrics_data 
    @facebook_metrics = @influencer_metrics.new(
     reach_change_value: calculate_metrics['reach_change_value'], 
     reach_change_type: calculate_metrics['reach_change_type'], 
     social_account: SocialAccount.friendly.find('facebook') 
    ) 
    end 

calculate_metrics被調用了兩次,現在正在和完全處理兩次。有沒有關於如何優化相同的建議,以便我不必處理相同的數據兩次。

+0

作爲從快看,在set_metrtics_data爲什麼不把calculate_metrics在tmp變量x中的結果,然後詢問x:calculate_metrics [y]和x:calculate_metrics [z]? –

+0

ahh有道理:)將試試:) –

+0

讓我知道結果:) –

回答

1

set_metrics_data把calculate_metrics的結果放在一個tmp變量中,讓我們叫它x,然後詢問x的類型和值。這將是這樣的:

x = calculate_metrics 
reach_change_value : x['reach_change_value'] 
each_change_type : x['reach_change_type']` 

結果到calculate_metrics通話時才調用(並存儲在TMP變量x)。

0

您可以按照M. Suurland答案像

x = calculate_metrics 
reach_change_value : x['reach_change_value'] 
each_change_type : x['reach_change_type']` 

和一些優化/語法變化calculate_metrics你可以使用這樣

def calculate_metrics 
    reach_values = {'reach_change_value': 0, 'reach_change_type': "nochange"} 
    yesterday_mat = find_yesterdays_metrics 
    if yesterday_mat 
     change = (get_influencer_metrics["total_count"]).to_i - yesterday_mat.reach_count 
     reach_values = 
      case change 
      when change < 0 
       {'reach_change_type': "down", 'reach_change_value': change.abs} 
      when change > 0 
       {'reach_change_type': "up", 'reach_change_value': change.abs} 
      else 
       reach_values 
      end 
    end 
    reach_values 
end 
+0

你的額外建議並沒有優化他的代碼,你只是改變了語法,最後編譯後的代碼將和他原來的一樣。 –

+0

Oh dear @ M.Suurland I也改變了一些代碼,並且語法不僅僅是downvote – Thorin

+0

優化代碼或者改變它的語法是兩個完全不同的東西,在你的建議中命名,你現在制定它的方式(「進一步優化calculate_metrics」)會使他認爲你的建議「運行」比他的原始速度更快,而不是這種情況 –