小结(3)
以上用到了9个方法实现一个问题,在实现的过程中试验数据量为n=10。得到不同方法所用的平均耗时间大小。每种方法在计算平均耗时的重复次数为N =100。当然上述的每个方法测试的数据量尽管相同,但由于(1)数据内容不尽相同,(2)由于测试耗时的时候后台打开的程序多少不同(CPU和内存任务量不同),(3)每种方法所处理的内容不尽相同。这些都对所测试的结果产生影响。为此,为了减小这些影响,本节主要通过增加数据量大小(n)(也可以增加重复次数(N ),本例没加以讨论)来估测每种方法的优劣。另外,为了具有可比性,以下统计结果均为处理单个数据所消耗的时间。时间单位为微秒(microsecond)
根据上述9个函数,
#根据上述数据生成图
library(tidyverse)
data
data
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")
从上图可以看出,随着数据量的增加,处理每个数据所需的平均时间均呈减少趋势。先不说ddply的并行运算,其它8个函数均在数据量小于250的时候,随着数据量的增加,处理每个数据平均时间急速减少;当数据量大于250时,随着数据量的增加,处理每个数据平均时间减少趋势逐渐放缓。
我们进一步分析数据量大于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))
从上图可以看出,随着数据量的增加,每个数据不同方法的平均运算时间都在减少,但减速不同,在数据量400
总体来说,ddply>[for_ifelse,str_replace,for_switch]>[which,join]
为此,我们下一节主要讨论当数据量足够大时,这几个函数处理数据的平均 时长是何种规律。
(未完!待续……)