R 是否可以加快data.table代码的速度?
我决定将我的代码从dplyr重写为data.table,因为我听说它更快 令人惊讶的是,我在执行时间上只获得了微不足道的加速。是我的数据太小还是我用可怕的data.table风格写的 除了输出的类之外,结果是相同的 我不是故意使用setDT(),因为这是主观的 编辑:我做了一个类似的可复制的例子R 是否可以加快data.table代码的速度?,r,performance,dplyr,data.table,R,Performance,Dplyr,Data.table,我决定将我的代码从dplyr重写为data.table,因为我听说它更快 令人惊讶的是,我在执行时间上只获得了微不足道的加速。是我的数据太小还是我用可怕的data.table风格写的 除了输出的类之外,结果是相同的 我不是故意使用setDT(),因为这是主观的 编辑:我做了一个类似的可复制的例子 pacman::p_load(gapminder, data.table, dplyr, stringr, microbenchmark) gapminder -> gapminder as_t
pacman::p_load(gapminder, data.table, dplyr, stringr, microbenchmark)
gapminder -> gapminder
as_tibble(gapminder) -> gapminder_tibble
as.data.table(gapminder) -> gapminder_data.table
microbenchmark(
dplyr = {
gapminder_tibble %>%
filter(year > 1900, year < 1990) %>%
mutate(country = str_sub(str_to_lower(country), 5)) %>%
count(country)
},
data.table = {
gapminder_data.table[year > 1900 & year < 1990][, country := str_sub(str_to_lower(country), 5)][, .(n = .N), by = country]
},
times = 1000
)
为什么呢?如何使它更快?有什么建议吗?在data.table中写入数据的最快方法是什么?您可以通过避免(不必要的)链接并将
str_()和str_sub()
gapminder_数据表【1900年和1990年】,
(n=0.n),
by=(国家=str_至较低(str_子(国家,5)))]
您可以setkey
让它运行得更快一点,这主要取决于执行此操作的行数。我使用的data.table通常超过100.000行。当处理1.000.000及以上时,差异非常显著。在您的情况下,尤其是在data.table中,mutate和group_by(在计数范围内)应该更有效。当您执行基准测试时,请确保您正在对苹果进行比较。目前,您正在为每次迭代使用as.data.table
,这会造成一些(轻微但可能不是无关紧要的)开销。比较应该只属于核心问题,在微基准测试之前做过任何,并且只做过一次。如果你做了一个可重复的例子,这将非常有用。3毫秒已经太快了,所以这个例子没有说明需要提高速度的情况。不过,通常使用较大的数据和某些操作会带来一些好处。
Unit: milliseconds
expr min lq mean median uq max neval cld
dplyr 2.441601 2.756801 3.165089 2.965350 3.181802 29.1171 1000 a
data.table 2.646601 3.101201 3.548372 3.383252 3.661500 11.9474 1000 b
gapminder_data.table[year > 1900 & year < 1990,
.(n = .N),
by = .(country = str_to_lower(str_sub(country, 5)))]