stringr处理factor远慢于Base R grep系列函数,是否为预期行为?
关于stringr处理factor类型数据性能远低于Base R的疑问
我一直使用stringr,因为它本该性能更优,但发现处理factor类型数据时速度远慢于Base R的grep系列函数,且未看到相关提示及原因说明。
示例代码:
string_options = c("OneWord", "TwoWords", "ThreeWords") sample_chars = sample(string_options, 1e6, replace = TRUE) sample_facts = as_factor(sample_chars)
处理character类型数据时,Base R比stringr慢,符合预期;但处理factor类型时,Base R的速度约为stringr的30倍。基准测试结果如下:
bench::mark( base_chars = grepl("Two", sample_chars), stringr_chars = str_detect(sample_chars, "Two"), base_facts = grepl("Two", sample_facts), stringr_facts = str_detect(sample_facts, "Two") ) # A tibble: 4 × 13 # expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time result memory time gc # <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm> <list> <list> <list> <list> #1 base_chars 116.1ms 116.38ms 8.58 3.81MB 0 5 0 583ms <lgl [1,000,000]> <Rprofmem [1 × 3]> <bench_tm [5]> <tibble> #2 stringr_chars 86.04ms 88.2ms 11.3 3.81MB 0 6 0 532ms <lgl [1,000,000]> <Rprofmem [2 × 3]> <bench_tm [6]> <tibble> #3 base_facts 3.59ms 3.65ms 271. 11.44MB 0 136 0 501ms <lgl [1,000,000]> <Rprofmem [3 × 3]> <bench_tm [136]> <tibble> #4 stringr_facts 90.71ms 91.29ms 10.9 11.44MB 0 6 0 549ms <lgl [1,000,000]> <Rprofmem [3 × 3]> <bench_tm [6]> <tibble>
看起来stringr处理factor时未做特殊优化,而Base R做了显著优化。请问这是预期行为吗?是否需要向stringr提交issue?是否有我忽略的stringr设置?我希望无需根据数据格式选择工具。
内容的提问来源于stack exchange,提问作者buggaby
相关产品推荐
相关产品推荐

