用对象获取列表反集,速度飞快

本文转自 http://ahkscript.org/boards/viewtopic.php?f=29&t=6589

 

昨天我碰到一个问题,要从 10 万个数字中获取 6 万左右数字的反集。我刚开始用的方法是用 InStr() 搜索 10 万次,结果是非常慢,大概要 40 秒钟。
本以为没其他方法了。不过还是带着试一试的态度,在英文板块发了个求助帖,别人回复说用对象。一测试竟然 0 秒就完成了!这个方法太有用了,特意在这里发个帖子让更多人知道 :D
测试代码:

SetBatchLines -1
 
; 生成 10 万个数字
    Loop, 100000
        fullList .= "," A_Index
    fullList := Trim(fullList, ",")
 
; 生成 6 万个数字
    Loop, 60000
        subList .= "," A_Index
    subList  := Trim(subList, ",")
 
; 获取 4 万个反集数字
 
    ; 方法一: InStr()
        TickCount_Start := A_TickCount ; 计时开始
 
        resultList := ""
        Loop, Parse, fullList, CSV
            If !InStr(subList, A_LoopField)
                resultList .= "," A_LoopField
 
        MsgBox, % "耗时: " (A_TickCount-TickCount_Start)/1000 "" ; 我这里显示“耗时: 38.516000 秒”
 
    ; 方法二: Object
        TickCount_Start := A_TickCount ; 计时开始
 
        ; 把 6 万个数字列表转为对象
        oSubList := {}
        Loop, Parse, subList, CSV
            oSubList[A_LoopField] := 1
 
        ; 开始...
        resultList := ""
        Loop, Parse, fullList, CSV
            If !oSubList[A_LoopField]
                resultList .= "," A_LoopField
 
        MsgBox, % "耗时: " (A_TickCount-TickCount_Start)/1000 "" ; 我这里显示“耗时: 0.125000 秒”

 

posted @ 2015-07-29 10:24  cui-YF  阅读(310)  评论(0编辑  收藏  举报