R语言为何能快速计算超大整数序列的求和?
R中计算超大连续整数序列的sum为何这么快?
首先要明确:当你执行x <- 1:1e20时,R并没有真的创建一个包含1e20个元素的物理向量——这在现实中完全不可能,光是存储1e20个整数需要的内存,已经远远超过了现有任何计算机的硬件极限。
R里的:运算符生成的是一种特殊的序列对象,它底层只存储三个信息:起始值、终止值和步长(默认步长是1),而非把每个元素都存在内存里。而sum()函数针对这种规则的连续整数序列做了专门优化,直接用数学公式计算总和,根本不需要遍历所谓的“1e20个元素”。
连续整数从1到n的总和公式是:n*(n+1)/2。R的sum()会先判断输入是否是这类规则序列,一旦识别出来,就直接套用公式计算,所以不管n是100还是1e20,计算速度都几乎是瞬间完成。
你可以自己验证:执行sum(1:100)和手动计算100*101/2,结果完全一致;而且计算sum(1:100)和sum(1:1e20)的耗时几乎没有差别——这就足以证明它没有在逐个遍历元素累加。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

