码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-29 11:43:00      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

本文转自 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 秒”

 

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

标签:

原文地址:http://www.cnblogs.com/easysky/p/4685201.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!