【发布时间】:2014-10-12 08:06:29
【问题描述】:
在 Python 中我可以这样做:
a = np.arange(100)
print id(a) # shows some number
a[:] = np.cumsum(a)
print(id(a)) # shows the same number
我在这里所做的是将 a 的 contents 替换为其 cumsum。前后地址相同。
现在让我们在 R 中尝试一下:
install.packages('pryr')
library(pryr)
a = 0:99
print(address(a)) # shows some number
a[1:length(a)] = cumsum(a)
print(address(a)) # shows a different number!
问题是如何用计算结果覆盖 R 中已经分配的内存?当我在 R 与 Rcpp 中进行向量运算时(用 C++ 编写代码并从 R 调用它,这让我避免了不必要的分配),缺乏这类东西似乎导致了显着的性能差异。
我在具有 24 个物理内核和 128 GB RAM 的 Ubuntu Linux 10.04 上使用 R 3.1.1。
【问题讨论】:
-
R 中的所有内容都是副本,除非您使用
data.table -
@James,这不准确。 R 在某些情况下避免复制时有一些
copy-on-modify规则。见here -
@James,例如尝试
a = 0:99 ;print(address(a)) ;b <- a ; print(address(b)) -
@DavidArenburg 非常有趣,谢谢。
-
补充一点 David 的观点,R 3.1+ 避免了深拷贝,而是在许多地方进行了 浅 拷贝(这极大地提高了性能)。