小結(jié)(3)
以上用到了9個方法實現(xiàn)一個問題卿闹,在實現(xiàn)的過程中試驗數(shù)據(jù)量為n=10精偿。得到不同方法所用的平均耗時間大小鹤树。每種方法在計算平均耗時的重復(fù)次數(shù)為N =100。當(dāng)然上述的每個方法測試的數(shù)據(jù)量盡管相同烹困,但由于(1)數(shù)據(jù)內(nèi)容不盡相同,(2)由于測試耗時的時候后臺打開的程序多少不同(CPU和內(nèi)存任務(wù)量不同)乾吻,(3)每種方法所處理的內(nèi)容不盡相同髓梅。這些都對所測試的結(jié)果產(chǎn)生影響。為此绎签,為了減小這些影響枯饿,本節(jié)主要通過增加數(shù)據(jù)量大小(n)(也可以增加重復(fù)次數(shù)(N )诡必,本例沒加以討論)來估測每種方法的優(yōu)劣奢方。另外,為了具有可比性,以下統(tǒng)計結(jié)果均為處理單個數(shù)據(jù)所消耗的時間袱巨。時間單位為微秒(microsecond)
根據(jù)上述9個函數(shù)阁谆,
#根據(jù)上述數(shù)據(jù)生成圖
library(tidyverse)
data<-read.csv("/home/xh/300G/筆記/R/10~1000.csv")
data<-gather(data,type,mean,-c("fun","n","N"))
head(data)
fun n N type mean
1 for_if 10 100 Month 1.167005
2 for_if_else 10 100 Month 0.918378
3 for_ifelse 10 100 Month 16.727339
4 for_switch 10 100 Month 1.713591
5 which 10 100 Month 5.705561
6 join 10 100 Month 183.532495
ggplot(data,aes(n,mean,color=fun))+
geom_point()+
facet_wrap(~type)+
theme(axis.text.x = element_text(angle=90))+
scale_x_continuous(name="length of vector")+
scale_y_continuous(name="time")
從上圖可以看出,隨著數(shù)據(jù)量的增加愉老,處理每個數(shù)據(jù)所需的平均時間均呈減少趨勢场绿。先不說ddply的并行運算,其它8個函數(shù)均在數(shù)據(jù)量小于250的時候嫉入,隨著數(shù)據(jù)量的增加焰盗,處理每個數(shù)據(jù)平均時間急速減少;當(dāng)數(shù)據(jù)量大于250時咒林,隨著數(shù)據(jù)量的增加熬拒,處理每個數(shù)據(jù)平均時間減少趨勢逐漸放緩。
我們進一步分析數(shù)據(jù)量大于250的情形:
ggplot(data[which(data$fun!="ddply_parallel"),],aes(n,mean,color=fun))+
geom_point()+
facet_wrap(~type)+
theme(axis.text.x = element_text(angle=90))+
scale_x_continuous(name="length of vector",limits=c(250,1000))+
scale_y_continuous(name="time",limits=c(0,80))
從上圖可以看出垫竞,隨著數(shù)據(jù)量的增加澎粟,每個數(shù)據(jù)不同方法的平均運算時間都在減少,但減速不同欢瞪,在數(shù)據(jù)量400<n<700時活烙,處理每個數(shù)據(jù)所需平均時間ddply最大,接下來是for_ifelse遣鼓、str_replace和join啸盏,其余的幾個函數(shù)所用時較小。另一方面 骑祟,盡管ddply等用時較長回懦,但隨著數(shù)據(jù)量的增多,所需時長遞減速較大次企。
總體來說怯晕,ddply>[for_ifelse,str_replace,for_switch]>[which,join]。
為此抒巢,我們下一節(jié)主要討論當(dāng)數(shù)據(jù)量足夠大時贫贝,這幾個函數(shù)處理數(shù)據(jù)的平均 時長是何種規(guī)律。
(未完蛉谜!待續(xù)……)