在多处理,R或Python中哪个更快?
第一个是R中的不同种类的循环。建议根据迭代的复杂性和大小使用不同种类的循环。
第二篇文章是Loop-Runtime Compare R,RCPP,Python,展示了非昂贵任务的并行和顺序处理性能。
这篇文章是关于昂贵的任务。
通常,对于不昂贵的任务,多处理是不合适的。直到一定程度的复杂性,将任务分配到内核(处理器管理)的成本要比按顺序运行循环的成本更高。具体来说,在Python的情况下,这是由于全局解释器锁定(GIL)引起的问题。
面临的挑战是研究哪种(R或Python)更适合处理大量昂贵的任务。为了进行比较,在Python和R中都使用了顺序for循环和多处理。
在这种特定情况下,任务是检查某个数字是否为质数。为了简化,测试从3开始而不是2。
机器是:
i7 8700k,16Gb GDDR5 RAM
R代码:
################################################ ###############################################
library(parallel)
NumOfCores <-detectCores()-1个
集群<-makeCluster(NumOfCores)
大小<-c(100,1000,10000,20000,30000,40000,50000)
rep <-rep(0,时间=长度(大小))
z = 1
原始<-函数(i){
chech_vec =(i-1):2
P = i %% chech_vec
如果(任何(P == 0)){
return(“ n”)
}其他{
return(“ y”)
}
}
for(大小为j){
开始= Sys.time()
PrimNum <-parSapply(cl =簇,X = 3:j,FUN = Prim)
结束= Sys.time()
rep [z] =结束-开始
z = z + 1
}
z = 1
for(大小为j){
PrimNum = rep(NA,次=(j))
开始= Sys.time()
for(3:j中的i){
PrimNum [i-2] <-Prim(i)
}
结束= Sys.time()
rep [z] =结束-开始
z = z + 1
}
################################################ ###############################################
等效的Python代码:
################################################ ################################# ################
导入时间
将numpy导入为np
导入多处理
从joblib导入延迟,并行,parallel_backend
核心= multiprocessing.cpu_count()-1
大小= [101、1001、10001、20001、30001、40001、50001]
rep = [0] * len(大小)
z = 0
def Prim(i):
chech_vec = list(range(2,(i)))
P = np.mod(i,chech_vec)
如果有(P == 0):
返回“ n”
其他:
返回“ y”
#更改 inner_max_num_threads没关系。此外,对于此任务,后端“线程”甚至更慢。
对于j的大小:
开始= time.time()
如果__name__ ==“ __main__”:
与parallel_backend(“ loky”,inner_max_num_threads = 2):
PrimNum = Parallel(n_jobs = cores)(i范围(3,j)中的延迟(Prim)
)
结束= time.time()
rep [z] =结束-开始
z + = 1
z = 0
对于j的大小:
PrimNum = [0] * j
开始= time.time()
对于范围(3,j)中的i:
PrimNum = Prim(i)
结束= time.time()
rep [z] =结束-开始
z + = 1
################################################ ################################# ################
结果是:

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!