为何`as.logical()`的执行速度远快于`logical(0)`?
为什么
as.logical()比logical(0)更快? as.logical()无参数调用时会直接返回logical(0):
as.logical() #> logical(0)
但测试发现logical(0)的执行速度远慢于as.logical(),其他as.*()系列函数也存在同样的差异:
bench::mark(as.logical(), logical(0), iterations = 1e5) #> # A tibble: 2 × 6 #> expression min median `itr/sec` mem_alloc `gc/sec` #> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> #> 1 as.logical() 48.1ns 76ns 8467061. 0B 0 #> 2 logical(0) 468ns 571ns 1541503. 0B 30.8 bench::mark(as.character(), character(0), iterations = 1e5) #> # A tibble: 2 × 6 #> expression min median `itr/sec` mem_alloc `gc/sec` #> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> #> 1 as.character() 65ns 94.1ns 9734069. 0B 0 #> 2 character(0) 505ns 593ns 1550503. 0B 15.5 bench::mark(as.numeric(), numeric(0), iterations = 1e5) #> # A tibble: 2 × 6 #> expression min median `itr/sec` mem_alloc `gc/sec` #> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> #> 1 as.numeric() 58.1ns 91ns 10218252. 0B 0 #> 2 numeric(0) 500ns 561ns 1622768. 0B 16.2 bench::mark(as.integer(), integer(0), iterations = 1e5) #> # A tibble: 2 × 6 #> expression min median `itr/sec` mem_alloc `gc/sec` #> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> #> 1 as.integer() 64ns 92ns 9863536. 0B 0 #> 2 integer(0) 469ns 582ns 1435752. 0B 14.4
核心原因
这两类函数的底层实现逻辑完全不同:
- 当
as.*()函数无参数调用时,R会直接返回一个预定义的全局空向量对象,不需要做任何额外的参数检查或内存分配操作,相当于直接取用现成的常量,所以速度极快。 - 而
logical()、character()这类构造函数,即使传入参数0,也需要执行完整的函数流程:包括参数类型检查、验证输入合法性、调用内存分配接口创建新的空向量,这些额外步骤带来了明显的性能开销。
简单来说,as.*()无参数调用是"拿现成的",而*(0)是"现场创建一个",自然前者更快。
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

