首页 > 解决方案 > 如何使用 Rmpfr::mpfr 减少计算时间?

问题描述

z1f 和 z1f.mpfr 的功能除了使用 Rmpfr 之外是相同的。但是,z1f.mpfr 的运行时间明显高于 z1f,即使我使用的 precBits 比没有 mpfr 的默认值小。以下代码:

library(Rmpfr)

DecimalDigits=20

z1f.mpfr <- function(sample_freq, precBits = DecimalDigits)
{
  khat<-length(sample_freq)
  n<-sum(sample_freq)
  prod<-mpfr(rep(1,khat), precBits)
  zf<-mpfr(rep(0,n), precBits)
  for (v in 1:n){
    for (k in 1:khat){
      if (sample_freq[k]>=1){
        zf[v] = zf[v]+mpfr(sample_freq[k],precBits)/mpfr(n, precBits)*prod[k];
        prod[k] = prod[k]*(mpfr(1, precBits)-mpfr(sample_freq[k]-1, precBits)/mpfr(n-v, precBits));
      }
    }
  }
  return(zf)
}


z1f <- function(sample_freq)
{
  khat<-length(sample_freq)
  n<-sum(sample_freq)
  prod<-rep(1,khat)
  zf<-rep(0,n)
  for (v in 1:n){
    for (k in 1:khat){
      if (sample_freq[k]>=1){
        zf[v] = zf[v]+sample_freq[k]/n*prod[k];
        prod[k] = prod[k]*(1-(sample_freq[k]-1)/(n-v));
      }
    }
  }
  return(zf)
}

sample <- c(44, 30, 19, 10, 13, 7, 9, 6, 8, 8, 11, 4, 3, 3, 1, 2, 3, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1)

> system.time(z1f.mpfr(sample))
                      user                     system                    elapsed 
16.21299999999999386091076  0.02100000000000079580786 16.24599999999918509274721 

> system.time(z1f(sample))
                       user                      system                     elapsed 
0.0010000000000047748471843 0.0000000000000000000000000 0.0009999999992942321114242 

我的问题有两个:

  1. 为什么会有如此巨大的差异?
  2. 我们可以抵消差异吗?

谢谢!

标签: rtimempfr

解决方案


(我是包维护者:@Data Munger 是正确的:如果您不使用非常快的 CPU 内置浮点运算,而是使用基于 MPFR 的运算,那么您将付出相当大的代价。还有更多——额外的低效率我的Rmpfr包原则上可以被淘汰。为此,我需要擅长 R 和 C 编程的合作者......)。

第二:你真的应该在使用它们之前阅读重要功能的帮助页面......在任何 R 包中。
在这种情况下,您已经错误地开始了: precBits精度和位是二进制数字而不是十进制数字......所以你precBits = DecimalDigits在你的函数中是..抱歉说..胡说八道。

要从位到数字或返回,您必须用 / 乘以或除以 log10(2) ~= 0.3,即

bits <- ceiling(decimals / log10(2))

例如,

> (digits <- 10*(1:4))
[1] 10 20 30 40
> (bits <- ceiling(digits / log10(2)))
[1]  34  67 100 133
> 

...是的,请使用 <-:它对您所有的代码阅读器都更友好,包括您未来的自己;-)


推荐阅读