gpt4 book ai didi

R 微基准: How to pass same argument to evaluated functions?

转载 作者:行者123 更新时间:2023-12-02 20:20:00 25 4
gpt4 key购买 nike

我想评估使用不同文件类型(geotiff、二进制)或对象(RasterBrick、RasterStack)从栅格时间序列中提取数据的时间。我创建了一个函数,该函数将从栅格​​对象的随机点提取时间序列,然后使用微基准测试它。

例如:

# read a random point from a raster stack
sample_raster <- function(stack) {
poi <- sample(ncell(stack), 1)
raster::extract(stack, poi)
}

# opening the data using different methods
data_stack <- stack(list.files(pattern = '3B.*tif'))
data_brick <- brick('gpm_multiband.tif')

bench <- microbenchmark(
sample_stack = sample_raster(data_stack),
sample_brick = sample_raster(data_brick),
times = 10
)

boxplot(bench)

# this fails because sampled point is different
bench <- microbenchmark(
sample_stack = sample_raster(data_stack),
sample_brick = sample_raster(data_brick),
times = 10,
check = 'equal'
)

我包含了我的数据集的样本 here

通过这个,我可以看到在RasterBrick上采样比堆栈更快(R Raster手册也这么说——很好)。问题是我在每个评估表达式的不同点进行采样。所以我无法检查结果是否相同。我想做的是在两个对象的同一位置(poi)进行采样。但每次迭代的位置都不同。我尝试在微基准测试中使用 setup 选项,但据我了解,setup 是在每个函数计时之前评估的,而不是每次迭代一次。因此,使用该设置生成随机poi将不起作用。

是否可以将相同的参数传递给在微基准测试中评估的函数?

结果

使用microbenchmark的解决方案

按照建议(并在下面解释),我尝试了带有 press 调用的 bench 包。但由于某种原因,它比在每次 microbenchmark 迭代中设置相同的种子要慢,正如 mnist 所建议的那样。所以我最终回到了microbenchmark。这是我正在使用的代码:

library(microbenchmark)
library(raster)

annual_brick <- raster::brick('data/gpm_tif_annual/gpm_2016.tif')
annual_stack <- raster::stack('data/gpm_tif_annual/gpm_2016.tif')

x <- 0
y <- 0

bm <- microbenchmark(
ext = {
x <- x + 1
set.seed(x)
poi = sample(raster_size, 1)
raster::extract(annual_brick, poi)
},
slc = {
y <- y + 1
set.seed(y)
poi = sample(raster_size, 1)
raster::extract(annual_stack, poi)
},
check = 'equal'
)

使用 bench::press 的解决方案

为了完整起见,我就是这样做的,使用bench::press。在此过程中,我还将用于选择随机单元的代码与点采样函数分开。所以我只能对代码的点采样部分进行计时。这是我的做法:

library(bench)
library(raster)

annual_brick <- raster::brick('data/gpm_tif_annual/gpm_2016.tif')
annual_stack <- raster::stack('data/gpm_tif_annual/gpm_2016.tif')

bm <- bench::press(
pois = sample(ncell(annual_brick), 10),
mark(
iterations = 1,
sample_brick = raster::extract(annual_brick, pois),
sample_stack = raster::extract(annual_stack, pois)
)
)

最佳答案

我的方法是为 microbenchmark 中的每个选项设置相同的席位,但在每次函数调用之前更改它们。查看输出以及最终如何将相同的席位用于两个调用

x <- 0
y <- 0

microbenchmark::microbenchmark(
"checasdk" = {
# increase seat value by 1
x <- x + 1
print(paste("1", x))
set.seed(x)},

"check2" = {
y <- y + 1
print(paste("2", y))
set.seed(y)
}
)

关于R 微基准: How to pass same argument to evaluated functions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59686843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com