Python 板


LINE

※ 引述《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 提供不同的观点参考参考 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.229.89.102
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1519804063.A.817.html
1F:→ celestialgod: R用八个核心结果比单核只快2倍多,怪怪的02/28 16:55
2F:→ celestialgod: 而且R可以直接用match做02/28 17:00
3F:→ celestialgod: 甚至是fastmatch::fmatch都可以很快02/28 17:00
只是做个简单的比较,用比较相近的 R and Python code,感谢大大提供更进阶的方法 其实 R 速度也不输给 Python
4F:推 vfgce: python将list a 改成dict,速度比R还快...02/28 18:00
5F:推 Sunal: 同楼上 BigO比一下就知道了 02/28 18:43
6F:推 vfgce: 对R没偏见,语法较python简洁且内建支援矩阵,但原生R真的 02/28 19:23
7F:→ vfgce: 大部分情况都比python慢. 02/28 19:24
根据 celestialgod 大 跟 vfgce 大的意见进行修正 以下是 R and Python code #================================== # python import random import datetime list_a = random.sample(range(0,100000),70000) list_b = random.sample(range(0,5000000),3000000) list_a = { i:list_a[i] for i in range(len(list_a))} res_li = [] s = datetime.datetime.now() for x in list_b: res_li.append( list_a.get(x,'') ) t = datetime.datetime.now() - s print(t) # 0:00:01.056265 #================================== # R install.packages('fastmatch') library(fastmatch) list_a = sample(c(0:100000),70000,replace = FALSE) list_b = sample(c(0:5000000),3000000,replace = FALSE) s = Sys.time() res_li = fmatch(list_b,list_a, nomatch = -1) res_li[res_li==-1]='' t = Sys.time() - s print(t) # Time difference of 0.5497556 secs PS : 单纯做个比较,两个语言各有优缺点,多会一点也不坏 ※ 编辑: f496328mm (36.229.89.102), 02/28/2018 19:48:51
8F:推 Sunal: 语言这种问题是战不完的 单纯要拼这种速度可以拉C/C++ 02/28 22:43
9F:→ Sunal: FORTRAN Rust go..........还是看要应用而定 02/28 22:44
10F:→ Sunal: 如果这种计算不多 并且是要做web app呢? 02/28 22:48
11F:→ f496328mm: 不是要拚速度拉 只是提供一个参考 02/28 22:53
12F:推 Sunal: 如果是作分析/统计 多参考是没错的,但是要做到产品阶段 02/28 22:59
13F:→ Sunal: 还是要考虑不同语言的应用场景XDXDXD 02/28 23:00
14F:→ uranusjr: 这到底能参考到什麽我实在是看不出来 03/01 01:03
15F:推 joyolkreg: 如果能说明R版本的方法或概念如何改进python版本比较好 03/01 06:20
16F:→ joyolkreg: ,不然看起来是在拼语言 03/01 06:20
17F:推 Sunal: 研究分析你想用什麽语言都行,但是这样的效能差距,应该还 03/01 07:44
18F:→ Sunal: 不足达到转换语言的程度,更何况这段py code还可再修改会 03/01 07:44
19F:→ Sunal: 更快的可能。所以:参考不到什麽+看起来就是在拼速度(无误 03/01 07:44
20F:→ Sunal: ) 03/01 07:44
21F:→ galeondx: https://goo.gl/s5YL2D 03/06 05:15
22F:推 XiDaDa5566: 可以参考出python比R语言慢很多啊 03/07 02:33







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP