r - 如何使用 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
我的问题有两个:
- 为什么会有如此巨大的差异?
- 我们可以抵消差异吗?
谢谢!
解决方案
(我是包维护者:@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
>
...是的,请使用 <-
:它对您所有的代码阅读器都更友好,包括您未来的自己;-)
推荐阅读
- javascript - 为数组中的每个对象赋值,无需循环
- git - 如何验证 git clone/pull 文件匹配服务器?
- metal - MetalPerformanceShaders MTLCommandBuffer 并行运行
- html - 下划线悬停效果占用整个空间,但它应该只占用文本空间
- drupal-8 - 迁移:如果实体查找未能找到匹配项,则整行都应该失败
- arrays - 检查 Excel 单元格是否包含数组项
- jquery - Laravel:内部请求的 AJAX 状态 0
- c# - 根据asp.net c#中的文本框值更改下拉列表项
- c# - 反射 PropertyInfo SetValue C#
- javascript - 在Javascript中的表格单元格中插入元素