比较 R 和 Python 矢量化和优化

Comparing R and Python Vectorization and Optimization

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

因此,出现以下问题:

Python 中的 np.array() 函数相比,purrr::map()furrr::future_map() 函数的优化效果如何? 56=]R语言?

通过对 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

循环: 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:数据分析和图形语言,计算和图形统计杂志,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

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