【发布时间】:2021-11-28 13:21:27
【问题描述】:
在 R 语言中,可以通过使用purrr::map() 或furrr::future_map() 函数来实现优化。但是,我不确定 np.array() 方法的优化是如何工作的。实际上,我想了解 Python 和 R 在复杂性和性能方面如何扩展到并行处理 [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