【问题标题】:Comparing R and Python Vectorization and Optimization比较 R 和 Python 向量化和优化
【发布时间】:2021-11-28 13:21:27
【问题描述】:

R 语言中,可以通过使用purrr::map()furrr::future_map() 函数来实现优化。但是,我不确定 np.array() 方法的优化是如何工作的。实际上,我想了解 PythonR 在复杂性和性能方面如何扩展到并行处理 [1, 2]。

因此,出现以下问题:

R 语言中的 purrr::map()furrr::future_map() 函数相比,Python 中的 np.array() 优化如何工作?

通过对purrr/furrr 进行简单的tictoc 测试,我可以观察到在这两种情况下我们都从矢量化中获得了巨大的胜利。尽管如此,我也注意到结果似乎表明 R 语言从根本上更快。

Python

import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

tic = time.time()
c = np.dot(a,b)
toc = time.time()

print ("Vectorized version:" + str(1000*(toc-tic)) +"ms")

c = 0
tic = time.time()
for i in range(1000000):
  c += a[i]*b[i]
toc = time.time()

print("For loop:" + str(1000*(toc-tic)) +"ms")

输出

矢量化版本: 54.151296615600586ms

For循环: 676.0082244873047ms

R

a <- runif(1000000,0,1)
b <- runif(1000000,0,1)

c = 0
tictoc::tic()
c = sum(a * b)
tictoc::toc()

c = 0
tictoc::tic()
  for (i in 1:length(a)) {
    c = a[i]*b[i] + c
  }
tictoc::toc()

输出

矢量化版本: 0.013 秒过去

For 循环: 0.065 秒过去

参考文献

[1] Ross Ihaka & Robert Gentleman (1996) R: A Language for Data Analysis and Graphics, Journal of Computational and Graphical Statistics, 5:3, 299-314, DOI: 10.1080/10618600.1996.10474713

[2] S. van der Walt、S. C. Colbert 和 G. Varoquaux,“NumPy 数组:高效数值计算的结构”,《科学与工程计算》,卷。 13,没有。 2,第 22-30 页,2011 年 3 月至 4 月,doi:10.1109/MCSE.2011.37

【问题讨论】:

  • 有什么相似之处?
  • 另外,你似乎习惯于使用 R,那么为什么还要使用 Python 呢?
  • 您最近的编辑使这个问题变得更加广泛,而您确实应该将它作为一个更具体的问题来解决这个问题
  • 您只需要在每个帖子中问其中一个问题,而且我不知道这些单独的问题是否都适合 SO。这是它第三次出现在重新开放队列中,但仍然太宽泛
  • 如果您不想实现测量,请使用 timeit。 %timeit np.dot(a,b) 在不是非常慢的 cpu 上的实际时间应该是 0.x ms(取决于 BLAS 后端(例如 Intel MKL)。您还可以包括例如使用 Numba 的 jit 编译函数。(也在 0 中运行) .x ms) 不包括编译时间(编译后的函数也可以被缓存)。对于 R 代码也应该做类似的事情,这对于编译语言来说看起来很慢(也许包括一些编译时间?)

标签: python r optimization vectorization


【解决方案1】:

我相信 numpy 将它的一些“原始”对象包装在包装器类中,这些包装器类本身就是 Python(例如this 之一)。 在查看 R 镜像源时,我发现一个 array 类基本上是本机代码(又名 C)。 我猜这个额外的间接层可以解释速度上的差异。

【讨论】:

  • 是的,但复杂性和性能水平如何?
  • 基于上述基准 (n=1),似乎加速了 4 倍。运行许多独立的基准会提供更多数据,但 4 倍似乎是公平的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多