关于R中向量化和并行化的一般问题

问题描述 投票:1回答:1

我是R的新手,但我想了解并在Rstudio中使用TensorFlow快速生成代码。我理解并行化的概念,但我有一些问题来理解这些概念之间的差异:并行化,矢量化和张量化(对不起我的英语)。我想通过一些简单的例子来理解这些区别,我可以同时应用所有这些概念吗?

r tensorflow
1个回答
5
投票

下面是我对R中并行化和矢量化的两点看法,由于我对TensorFlow没有太多经验,所以不谈张量化。然而,由于我有微分几何的背景,我最好的猜测是它意味着使用张量,也就是高维(数据)结构来处理某些问题。

并行化

并行化的基本思想是运行任务 同时. 通常情况下,特别是在R中实现时,这个概念是通过 多处理:通常这将把任务分配给计算机的CPU(或线程,参见 多线程 或查看这个伟大的 所以回答). 此外,并行化可以被视为解决以下问题的一种方法: 1. 并发后者还有其他实现方式,如 异步编程.

并行化(也包括并发)的典型例子如下。假设你有一个URL的列表 url1, url2, ... 而你需要向其中的每一个发送一个GET请求(并等待响应)。经典的(同步)方式是遍历所有的URL,发出GET请求。等待 的响应,然后(也只有这时)继续下一个URL。

# Dummy example list
urls <- rep('http://example.com', 7)
# Fetching the data
results <- rep(list(NA), length(urls))
for (k in seq_along(urls))
  results[[k]] <- httr::GET(urls[k])

之所以说这是一个经典的例子,是因为(通常)这些请求是相互独立的:理论上,我们不必等待第一个响应后再进行第二个请求。所以我们可以同时发送这些请求。

# Parallel
urls <- rep('http://example.com', 7)
num_cores <- parallel::detectCores() - 1
cl <- parallel::makeCluster(num_cores)
parallel::clusterEvalQ(cl, library(httr))
parallel::clusterExport(cl, varlist = c('urls'))
results <- parallel::parLapply(cl, urls, httr::GET)
parallel::stopCluster(cl)

在上面的代码中,大部分行都是关于设置的,但关键的行是第二行到最后一行:这是我们在不同的可用核心(CPU)上分配和执行任务的地方。

从本质上讲,并行化与任务密切相关 时间。

矢量化

这个题目就简单多了。R语言本质上是为向量化操作优化的。矢量、矩阵和数组都是R语言的内建--而不是任何语言的内建。

此外,操作和函数也是向量化的。例如R支持向量的分割 1:5 / 11:15 并且大多数情况下,它的表现就像人们所期望的那样(典型的陷阱已经被详细记录下来,例如 1:5 + 11:20). 例如,Python有列表作为内建,但并不(本质上)支持矢量化。类似于 range(5) / range(11, 15) 会抛出一个错误(是的,有一些库可以使这成为可行的)。

但这不是黑魔法:当做 paste0("url_", 1:5) 循环 C 这也是为什么循环在R中名声不佳的原因(尽管 妥当 循环绝对没问题)。) 下面是一个很天真的例子

microbenchmark::microbenchmark(
  loop = {
    v1 <- 1:5; v2 <- 6:10
    result <- rep(NA, length(v1))
    for (k in seq_along(v1))
      result[k] <- v1[k] + v2[k]
  },
  vectorization = {
    result <- 1:5 + 6:10
  }
)
# Unit: nanoseconds
#          expr     min      lq       mean  median      uq     max neval cld
#          loop 1367900 1377052 1431076.98 1396951 1407551 4317901   100   b
# vectorization     400     501    1145.95    1500    1601    4001   100  a 

这里的底线是,矢量化在R中的每个角落都有(大部分),在我看来,它是R优雅的精髓,也是它最美的功能(自定义操作符也很整齐)。例如,我们可以创建sin的 泰勒扩建 与一言堂。

f <- function(x, n = 10) sum((-1)^(0:n) * x^(2*(0:n) + 1) / factorial((2*(0:n) + 1)))
f(0)
# 0
f(pi)
# 1.034819e-11

最后,除了美学之外,R的矢量化是一种哲学,一种处理问题的方式。给定一个特定的任务,在R语言中编码时,你总是会尝试提出一个矢量化的解决方案,而在其他语言中,你只会在循环的基础上应用循环。

© www.soinside.com 2019 - 2024. All rights reserved.