第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Go - 正則表達(dá)式內(nèi)循環(huán)

Go - 正則表達(dá)式內(nèi)循環(huán)

Go
當(dāng)年話下 2023-03-07 17:28:07
我有一個(gè)包含 600 個(gè)正則表達(dá)式模式列表的文件,大多數(shù)執(zhí)行這些模式是為了找到網(wǎng)站的特定 ID。例子:regex/www\.effectiveperformanceformat\.com/5regex/bam-cell\.nr-data\.net/5regex/advgoogle\.com/5regex/googleapi\.club/5regex/doubleclickbygoogle\.com/5regex/googlerank\.info/5regex/google-pr7\.de/5regex/usemarketings\.com/5regex/google-rank\.org/5regex/googleanalytcs\.com/5regex/xml\.trafficmoose\.com/5regex/265\.com/5regex/app-measurement\.com/5regex/loftsbaacad\.com/5regex/toldmeflex\.com/5regex/r\.baresi\.xyz/5regex/molodgytot\.biz/5regex/ec\.walkme\.com/5regex/px\.ads\.linkedin\.com/5regex/hinisanex\.biz/5regex/buysellads\.com/5regex/buysellads\.net/5regex/servedby-buysellads\.com/5regex/carbonads\.(net|com)/5regex/oulddev\.biz/5regex/click\.hoolig\.app/5regex/engine\.blacraft\.com/5regex/mc\.yandex\.ru/5regex/ads\.gaming1\.com/5regex/adform\.net/5regex/luzulabeguile\.com/5regex/ficanportio\.biz/5regex/hidelen\.com/5regex/earchmess\.fun/5regex/acrvclk\.com/5regex/track\.wg-aff\.com/5regex/thumb\.tapecontent\.net/5regex/betgorebysson\.club/5regex/in-page-push\.com/5regex/itphanpytor\.club/5regex/mktoresp\.com/5regex/xid\.i-mobile\.co\.jp/5regex/ads\.tremorhub\.com/5到目前為止,我正在使用的是這樣的for _, line := range file {l := linedata := strings.Split(l, "/")if data[0] == "regex" {                match, _ := regexp.MatchString(``+data[1]+``, website)                if match {                    id, _ = strconv.Atoi(data[2])                }            }}這是有效的,但我想知道是否有更優(yōu)化的方法來(lái)做到這一點(diǎn)。因?yàn)?,如果網(wǎng)站與頂部的正則表達(dá)式匹配,那就太好了,但如果不匹配,我需要一遍又一遍地循環(huán)直到找到它。任何人都可以幫我改進(jìn)這個(gè)嗎?
查看完整描述

1 回答

?
jeck貓

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊

為了減少緩存正則表達(dá)式的時(shí)間。


package main


import (

    "bufio"

    "bytes"

    "fmt"

    csvutils "github.com/alessiosavi/GoGPUtils/csv"

    "log"

    "os"

    "regexp"

    "strconv"

    "strings"

    "time"

)


func main() {

    now := time.Now()

    Precomputed("www.google.it")

    fmt.Println(time.Since(now))

    now = time.Now()

    NonPrecomputed("www.google.it")

    fmt.Println(time.Since(now))

}

func NonPrecomputed(website string) int {

    for _, line := range cachedLines {

        l := line

        data := strings.Split(l, "/")

        if data[0] == "regex" {

            match, _ := regexp.MatchString(``+data[1]+``, website)

            if match {

                id, _ := strconv.Atoi(data[2])

                return id

            }

        }

    }


    return -1

}

func Precomputed(site string) int {

    for regex, id := range rawRegex {

        if ok := regex.MatchString(site); ok {

            return id

        }

    }

    return -1

}


var rawRegex map[*regexp.Regexp]int = make(map[*regexp.Regexp]int)

var cachedLines []string

var sites []string


func init() {

    now := time.Now()

    file, err := os.ReadFile("regex.txt")

    if err != nil {

        panic(err)

    }


    scanner := bufio.NewScanner(bytes.NewReader(file))


    for scanner.Scan() {

        txt := scanner.Text()

        cachedLines = append(cachedLines, txt)

        split := strings.Split(txt, "/")

        if len(split) == 3 {

            compile, err := regexp.Compile(split[1])

            if err != nil {

                panic(err)

            }

            if rawRegex[compile], err = strconv.Atoi(split[2]); err != nil {

                panic(err)

            }

        }

    }

    file, err = os.ReadFile("top500Domains.csv")

    if err != nil {

        panic(err)

    }

    _, csvData, err := csvutils.ReadCSV(file, ',')

    if err != nil {

        panic(err)

    }

    for _, line := range csvData {

        sites = append(sites, line[1])

    }

    log.Println("Init took:", time.Since(now))

}

該init方法負(fù)責(zé)正則表達(dá)式緩存。它將加載具有相對(duì)索引的地圖中的所有正則表達(dá)式(它也會(huì)加載測(cè)試數(shù)據(jù),僅用于基準(zhǔn)測(cè)試)。


然后你有2個(gè)方法:


Precomputed: 使用緩存正則表達(dá)式的映射

NonPrecomputed:您的代碼段的復(fù)制->粘貼

如您所見,該NonPrecomputed方法能夠執(zhí)行 63 次,而Precomputed能夠執(zhí)行 10000 次。如您所見,當(dāng)方法沒(méi)有分配時(shí)(由于初始緩存),NonPrecomputed方法分配了 ~67 MBPrecomputed


C:\opt\SP\Workspace\Go\Temp>go test -bench=. -benchmem -benchtime=10s

2022/11/03 00:45:35 Init took: 10.8397ms

goos: windows

goarch: amd64

pkg: Temp

cpu: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz

Benchmark_Precomputed-8            10000           1113887 ns/op               0 B/op          0 allocs/op

Benchmark_NonPrecomputed-8            63         298434740 ns/op        65782238 B/op     484595 allocs/op

PASS

ok      Temp    41.548s


查看完整回答
反對(duì) 回復(fù) 2023-03-07
  • 1 回答
  • 0 關(guān)注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)