Rcppを使用してforループを高速化する方法は?

user3602239

forループを作成しましたが、Rcppライブラリを使用して高速化したいと思います。私はC ++にあまり精通していません。機能を高速化するのを手伝ってもらえますか?ご協力ありがとうございました!

アルゴリズム、コード、入力と出力、sessionInfoを含めました。

これが私のアルゴリズムです:

現在の価格が以前の価格を上回っている場合は、TRという名前の列に(+1)をマークします

現在の価格が以前の価格を下回っている場合は、TRという名前の列に(-1)をマークします

現在の価格が前の価格と同じである場合は、TRという名前の列に前の価格と同じものをマークします

これが私のコードです:

price <- c(71.91, 71.82, 71.81, 71.81, 71.81, 71.82, 71.81, 71.81, 71.81, 
           71.82, 71.81, 71.81, 71.8, 71.81, 71.8, 71.81, 71.8, 71.8, 71.8, 
           71.8, 71.81, 71.81, 71.81, 71.81, 71.81, 71.81, 71.81, 71.81, 
           71.81, 71.82, 71.81, 71.81, 71.81, 71.81, 71.81, 71.81, 71.8, 
           71.8, 71.81, 71.81, 71.81, 71.81, 71.82, 71.82, 71.81, 71.81, 
           71.81, 71.81, 71.81, 71.81, 71.81, 71.82, 71.82, 71.82, 71.82, 
           71.82, 71.82, 71.82, 71.81, 71.82, 71.82, 71.82, 71.82, 71.82, 
           71.82, 71.82, 71.82, 71.82, 71.81, 71.81, 71.81, 71.82, 71.82, 
           71.81, 71.82, 71.82, 71.82, 71.81, 71.82, 71.82, 71.82, 71.81, 
           71.81, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 
           71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 
           71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 
           71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 
           71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 
           71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 71.81, 
           71.82, 71.82, 71.82, 71.82, 71.83, 71.82, 71.82, 71.82, 71.81, 
           71.81, 71.81, 71.81, 71.81, 71.81, 71.81, 71.82, 71.82, 71.82, 
           71.81, 71.81, 71.81, 71.82, 71.82, 71.82, 71.82, 71.82, 71.82, 
           71.82, 71.82, 71.82, 71.82, 71.82, 71.83, 71.83, 71.83, 71.83, 
           71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 
           71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 
           71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 71.83, 
           71.83)

TR <- numeric(length(price)-1)
TR <- c(NA,TR)

for (i in 1: (length(price)-1)){

  if (price[i] == price[i+1]) {TR[i+1] = TR[i]}

  if (price[i] < price[i+1]) {TR[i+1] = 1}

  if (price[i] > price[i+1]) {TR[i+1] = -1}

}

そして、これが私の出力です: dput(TR)は

c(NA, -1, -1, -1, -1, 1, -1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 
  -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 
  -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 
  1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, 
  1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
  1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
  -1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

これが私のsessionInfoです:

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.4

loaded via a namespace (and not attached):
[1] chron_2.3-45  plyr_1.8.1    Rcpp_0.11.1   reshape2_1.4  stringr_0.6.2 tools_3.1.2  
josliber

forループをかなり直接変換できます。

library(Rcpp)
cppFunction(
"IntegerVector proc(NumericVector x) {
  const int n = x.size();
  IntegerVector y(n);
  y[0] = NA_INTEGER;
  for (int i=1; i < n; ++i) {
    if (x[i] == x[i-1]) y[i] = y[i-1];
    else if (x[i] > x[i-1]) y[i] = 1;
    else y[i] = -1;
  }
  return y;
}")

いつものように、ベースRのforループと比較して、Rcppを使用するとかなり大きなスピードアップを得ることができます。

proc.for <- function(price) {
  TR <- numeric(length(price)-1)
  TR <- c(NA,TR)
  for (i in 1: (length(price)-1)){
    if (price[i] == price[i+1]) {TR[i+1] = TR[i]}
    if (price[i] < price[i+1]) {TR[i+1] = 1}
    if (price[i] > price[i+1]) {TR[i+1] = -1}
  }
  return(TR)
}
proc.aaron <- function(price) {
  change <- sign(diff(price))
  good <- change != 0
  goodval <- change[good]
  c(NA, goodval[cumsum(good)])
}
proc.jbaums <- function(price) {
  TR <- sign(diff(price))
  TR[TR==0] <- TR[which(TR != 0)][findInterval(which(TR == 0), which(TR != 0))]
  TR
}

all.equal(proc(price), proc.for(price), proc.aaron(price), proc.jbaums(price))
# [1] TRUE
library(microbenchmark)
microbenchmark(proc(price), proc.for(price), proc.aaron(price), proc.jbaums(price))
# Unit: microseconds
#                expr     min       lq      mean   median       uq      max neval
#         proc(price)   1.871   2.5380   3.92111   3.1110   4.5880   15.318   100
#     proc.for(price) 408.200 448.2830 542.19766 484.1265 546.3255 1821.104   100
#   proc.aaron(price)  23.916  25.5770  33.53259  31.5420  35.8575  190.372   100
#  proc.jbaums(price)  33.536  38.8995  46.80109  43.4510  49.3555  112.306   100

forループと比較して100倍以上、提供されたベクトルのベクトル化された代替案と比較して10倍のスピードアップが見られます。

より大きなベクトル(ここでテストされた長さ100万)を使用すると、スピードアップはさらに重要になります。

price.big <- rep(price, times=5000)
all.equal(proc(price.big), proc.for(price.big), proc.aaron(price.big), proc.jbaums(price.big))
# [1] TRUE
microbenchmark(proc(price.big), proc.for(price.big), proc.aaron(price.big), proc.jbaums(price.big))
# Unit: milliseconds
#                    expr         min          lq        mean      median          uq        max neval
#         proc(price.big)    1.442119    1.818494    5.094274    2.020437    2.771903   56.54321   100
#     proc.for(price.big) 2639.819536 2699.493613 2949.962241 2781.636460 3062.277930 4472.35369   100
#   proc.aaron(price.big)   91.499940   99.859418  132.519296  140.521212  147.462259  207.72813   100
#  proc.jbaums(price.big)  117.242451  138.528214  170.989065  170.606048  180.337074  487.13615   100

これで、forループと比較して1000倍のスピードアップがあり、ベクトル化されたR関数と比較して約70倍のスピードアップがあります。このサイズでも、関数が1回だけ呼び出される場合、Rcppコードのコンパイルには少なくとも100ミリ秒かかるため、ベクトル化されたRソリューションよりもRcppの利点が大きいかどうかは明らかではありません。これが分析で繰り返し呼び出されるコードの一部である場合、スピードアップは非常に魅力的です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

numbaを使用してforループを高速化する

分類Dev

jenkinsを使用してトリガーされるgitプルを高速化する方法は?

分類Dev

グループ化とフィルタリングを使用してSQLServerクエリを高速化する方法

分類Dev

SQL Serverは、INSERTINTOを使用してWHILEループを高速化します

分類Dev

ccacheを使用してaospのコンパイルを高速化する方法は?

分類Dev

このループコードを高速化する方法は?

分類Dev

libclangを使用してC ++コードの解析を高速化する方法は?

分類Dev

Python関数の「for」ループを高速化する方法は?

分類Dev

forループを高速化する方法は?

分類Dev

マルチスレッドを使用してアプリケーションを高速化する方法

分類Dev

Rcppを使用してRコードを高速化できますか?

分類Dev

Outlook VBAを使用してSharePointテーブルにデータを挿入する(プロセスを高速化する方法は?)

分類Dev

このRcpp関数を高速化する方法は?

分類Dev

Pandas、Numpyを使用してPythonでネストされたforループロジックを高速化する方法は?

分類Dev

Debounce Lodash ReactNativeを使用して検索を高速化する方法

分類Dev

SymPyを使用して記号積分を高速化する方法は?

分類Dev

SPIを介してADSチップのサンプルレートを高速化する方法

分類Dev

ループ内でこの MATLAB コードを高速化する方法は?

分類Dev

C#でforループを高速化する方法はありますか?

分類Dev

いくつかの決定ルールを使用して、forループを高速化(またはループから離れる)する

分類Dev

Numba を使用して次のコードを高速化する

分類Dev

配列を使用してコードを高速化するExcelVBA

分類Dev

Rループを高速化する方法

分類Dev

MATLAB for ループを高速化する方法

分類Dev

このPyMongoクエリ/ループを高速化する方法

分類Dev

numpyでforループを高速化する方法

分類Dev

ExcelVBAでループを高速化する方法が必要

分類Dev

単純なパンダのfor / ifループを高速化する方法は?

分類Dev

Python DataFrameでネストされたループを高速化する方法は?

Related 関連記事

  1. 1

    numbaを使用してforループを高速化する

  2. 2

    jenkinsを使用してトリガーされるgitプルを高速化する方法は?

  3. 3

    グループ化とフィルタリングを使用してSQLServerクエリを高速化する方法

  4. 4

    SQL Serverは、INSERTINTOを使用してWHILEループを高速化します

  5. 5

    ccacheを使用してaospのコンパイルを高速化する方法は?

  6. 6

    このループコードを高速化する方法は?

  7. 7

    libclangを使用してC ++コードの解析を高速化する方法は?

  8. 8

    Python関数の「for」ループを高速化する方法は?

  9. 9

    forループを高速化する方法は?

  10. 10

    マルチスレッドを使用してアプリケーションを高速化する方法

  11. 11

    Rcppを使用してRコードを高速化できますか?

  12. 12

    Outlook VBAを使用してSharePointテーブルにデータを挿入する(プロセスを高速化する方法は?)

  13. 13

    このRcpp関数を高速化する方法は?

  14. 14

    Pandas、Numpyを使用してPythonでネストされたforループロジックを高速化する方法は?

  15. 15

    Debounce Lodash ReactNativeを使用して検索を高速化する方法

  16. 16

    SymPyを使用して記号積分を高速化する方法は?

  17. 17

    SPIを介してADSチップのサンプルレートを高速化する方法

  18. 18

    ループ内でこの MATLAB コードを高速化する方法は?

  19. 19

    C#でforループを高速化する方法はありますか?

  20. 20

    いくつかの決定ルールを使用して、forループを高速化(またはループから離れる)する

  21. 21

    Numba を使用して次のコードを高速化する

  22. 22

    配列を使用してコードを高速化するExcelVBA

  23. 23

    Rループを高速化する方法

  24. 24

    MATLAB for ループを高速化する方法

  25. 25

    このPyMongoクエリ/ループを高速化する方法

  26. 26

    numpyでforループを高速化する方法

  27. 27

    ExcelVBAでループを高速化する方法が必要

  28. 28

    単純なパンダのfor / ifループを高速化する方法は?

  29. 29

    Python DataFrameでネストされたループを高速化する方法は?

ホットタグ

アーカイブ