r - R 函数中的全局赋值运算符 - 有什么更好的选择?
问题描述
我在一个包中有一个函数(目前主要供我自己使用,将来可能会分享)。我正在尝试用 lapply 替换慢速 for 循环,以便以后可以并行化它。因此,我发现即使没有并行化也能更快的一种选择是使用全局赋值运算符。但是我对此感到焦虑,因为这似乎不受欢迎,而且我不习惯考虑环境,因此担心副作用:
这是一个简单的代表:
n <- 2
nx <- 40
v <- 5
d <- 3
array4d <- array(rep(0, n * nx * v * d) ,
dim = c(n, nx, v, d) )
array4d2 <- array4d
# Make some data to enter into the array - in real problem a function gens this data depending on input vars
set.seed(4)
dummy_output <- lapply(1:v, function(i) runif(n*nx*d))
microbenchmark::microbenchmark( {
for(i in 1:v){
array4d[ , , i, ] <- dummy_output[[i]]
}
}, {
lapply(1: v, function(i) {
array4d2[ , , i, ] <<- dummy_output[[i]]
})
})
Unit: microseconds
expr min lq
{ for (i in 1:v) { array4d[, , i, ] <- dummy_output[[i]] } } 1183.504 1273.6205
{ lapply(1:v, function(i) { array4d2[, , i, ] <<- dummy_output[[i]] }) } 13.257 16.1715
mean median uq max neval cld
1488.26909 1411.4565 1515.762 3535.974 100 b
33.56976 18.1445 21.150 1525.608 100 a
>
> identical(array4d, array4d2)
[1] TRUE
所有这些都将发生在其父级多次调用的函数中。
所以这(很多!)更快。但我的问题是
- 这样做安全吗?
- 有没有类似的快速替代方案不使用
<<-
?
解决方案
使可变维度成为最后一个维度。microbenchmark 表明其性能与使用全局变量的性能在统计上没有差异。如果重要的是维度是aperm(x, c(1, 2, 4, 3))
之后的第三次使用。
microbenchmark::microbenchmark(
a = for(i in 1:v) array4d[ , , i, ] <- dummy_output[[i]],
b = lapply(1: v, function(i) array4d2[ , , i, ] <<- dummy_output[[i]]),
c = array(unlist(dummy_output), dim(array4d3))
)
推荐阅读
- sharepoint-online - SharePoint 网站未编入索引
- php - 如何通过 Anspress 保存自定义字段
- firebase - 如何在 iOS (Swift4) 的后台使用 FCM 获取推送通知
- php - Laravel 类别、子类别和帖子
- layout - Gtk3 - 防止 TextView 使窗口增长
- javascript - 本地 .json 文件未显示数据
- amazon-web-services - 在 AWS Cognito 中检查 adminCreateUser 创建的用户的过期账户
- node.js - 如何在一个意图中设置上下文和后续事件?
- multithreading - 我可以为任务运行的最小和最大线程数应该是多少?
- chromecast - CAF 接收器,对 http 请求的关闭处理