我一直在通过 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% 的时间花在 "==" 操作上。有没有更快的矢量化方法?
第二个问题是我将耗尽内存——随着范围变大,这种方法的可扩展性不是很高。有没有一种很好的方法可以保持矢量化,但又不尝试将子集保留在内存中?