我试图了解 R 中的存储器分配。所以我填充了两种结果相同的方法。那么这是否意味着分配较少的方法是有效的
例如
## Method 1
f <- function(num) {
for(i in seq_len(num)) {
cat("Hello, world!\n") }}
object.size(f(1))
Hello, world!
0 bytes
## Method 2
asd <- "Hello, world!"
object.size(asd)
120 bytes
因此,如果您在上面看到,方法 1 比方法 1 更有效,对吧?(分别为 0 和 120 字节)
我的理解正确吗?
uj5u.com热心网友回复:
你不是在比较喜欢和喜欢。您的函式打印"Hello, world!"
但不回传任何内容。因此,当您运行时object.size(f(1))
,您实际上是在运行object.size(NULL)
,即 0(什么都没有的大小)。
如果您更改函式以使其回传字符串,则它等效于方法 2(为字符串赋值):
f <- function(num) {
for (i in seq_len(num)) {
return("Hello, world!\n")
}
}
object.size(f(1)) # 120 bytes
object.size(f(1)) == object.size("Hello, world!") # TRUE
无论哪种情况,您都在测量字符串的大小。但是,在这种情况下简单地分配字符串将使用更少的 RAM,因为函式本身会占用存储器空间:
object.size(f) # 16088 bytes
即使是 R 中的一个空函式也会占用大约 4k 的 RAM:
g <- function() {
return(TRUE)
}
object.size(g) # 4384 bytes
话虽如此,鉴于在 R 中您通常使用 RAM 中保存的资料,相比之下,开销存盘函式的数量通常可以忽略不计。大多数时候,在 R 中,您将希望优化代码的清晰度(即使用函式),而不是少量的 RAM。不过也有例外(例如,在回圈中呼叫一个函式数百万次)。
0 评论