※ 引述《CaptPlanet (ep)》之铭言:
: 有list_a, list_b两个list
: list_a 有大约 70000 个 elements
: list_b 大约 3 million 个 elements
: 程式大致如下:
: res_li = []
: for x in list_b:
: try:
: res_li.append(list_a.index(x))
: except:
: res_li.append("")
: 对 list_b 中的每一个 element
: 在 list_a 中找到一样 element 把他的 index 加到新的 list 中
: 随着 iteration 增加 速度变得越来越慢,
: 想请教各位为何会有这个现象以及有什么方法加速这个 for loop 呢?
: 谢谢各位高手
虽然这是 Python 版
我用 R 来比较一下速度
先讲结论
使用小 data 测试速度, list_a = 7,000笔, list_b = 300,000笔
python 耗时 : 24.7 秒
R 使用平行运算(mclappy) 耗时 : 1.2 秒
R 使用单核运算( sapply ) 耗时 : 2.9 秒
#==========================================
data 数量改为与原 po 相同, list_a = 70,000笔, list_b = 3,000,000笔
R 使用平行运算(mclappy) 耗时 : 69 秒
以下提供 code
#==========================================
# Python 版本
import numpy as np
import random
import time
import datetime
list_a = random.sample(range(0,10000),7000)
list_b = random.sample(range(0,500000),300000)
res_li = []
s = datetime.datetime.now()
for x in list_b:
try:
res_li.append( list_a.index( x ) )
except:
res_li.append("")
t = datetime.datetime.now() - s
print(t)
# 0:00:24.748111
# 耗时 24s
#==========================================
# R 版本
library(data.table)
library(dplyr)
library(parallel)
list_a = sample(c(0:10000),7000,replace = FALSE)# 7,000
list_b = sample(c(0:500000),300000,replace = FALSE)# 300,000
# case 1, 这里使用 R 的多核心运算
res_li = c()
s = Sys.time()
res_li = mclapply(c(list_b),function(x){
if( x %in% list_a ){
map = which(list_a==x)
#res_li = c(res_li,map)
}else{
map = ''
#res_li = c(res_li,map)
}
return(map)
}, mc.cores=8, mc.preschedule = T)
res_li = do.call(c,res_li)
t = Sys.time() - s
print(t)
# Time difference of 1.229357 secs
#===============================================
# case 2, 这里使用一般单核运算
res_li = c()
s = Sys.time()
res_li = sapply(c(list_b),function(x){
if( x %in% list_a ){
map = which(list_a==x)
#res_li = c(res_li,map)
}else{
map = ''
#res_li = c(res_li,map)
}
return(map)
})
t = Sys.time() - s
print(t)
# Time difference of 2.913066 secs
#===========================================
# 使用多核心, data 数与原 po 相同
list_a = sample(c(0:100000),70000,replace = FALSE)# 70,000
list_b = sample(c(0:5000000),3000000,replace = FALSE)# 3,000,000
res_li = c()
s = Sys.time()
res_li = mclapply(c(list_b),function(x){
if( x %in% list_a ){
map = which(list_a==x)
#res_li = c(res_li,map)
}else{
map = ''
#res_li = c(res_li,map)
}
return(map)
}, mc.cores=8, mc.preschedule = T)
res_li = do.call(c,res_li)
t = Sys.time() - s
print(t)
# Time difference of 1.151484 mins
提供不同的观点参考参考