You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何`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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.08 06:13:10