私は Project Euler を実行して、計算効率の高いプログラムを作成しようとしています。問題 1 を考えてみましょう: http://projecteuler.net/problem=1。非効率性を強調するために、範囲を 1000 から 10,000,000 に増やしました。
これが私の解決策です:
system.time({
x <- 1:1E7
a <- sum(as.numeric(x[x%%3 ==0 | x%%5==0]))
})
user system elapsed
0.980 0.041 1.011
これは、友人が同じことを行うために作成した C++ コードです。
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
long x = 0;
for (int i = 1; i < 10000000; i++)
{
if (i % 3 == 0)
x += i;
else if (i % 5 == 0)
x += i;
}
cout << x;
return 0;
}
cbaden$ time ./a.out
23333331666668
real 0m0.044s
user 0m0.042s
sys 0m0.001s
C++ は R よりも高速であることはわかっていますが、これははるかに高速ですか? Rprof は、モジュロ演算子にほぼ 60% の時間を費やし、「==」演算に 13% の時間を費やしていることを示しています。これをより速く行うためのベクトル化された方法はありますか?
二次的な懸念は、メモリが不足することです。このアプローチは、範囲が大きくなるにつれてあまりスケーラブルではありません。ベクトル化可能性を維持しながら、サブセットをメモリに保持しようとしない、これを行う良い方法はありますか?