首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Go strings.Contains()比Python3慢2倍?

Go strings.Contains()比Python3慢2倍?
EN

Stack Overflow用户
提问于 2018-07-31 19:01:48
回答 2查看 471关注 0票数 0

我正在将一个文本模式扫描器从Python3转换到Go1.10,但我很惊讶它实际上慢了2倍。经过分析,罪魁祸首在strings.Contains()中。请参阅下面的简单基准测试。我错过什么了吗?你能推荐一种更快的Go模式搜索算法,在这种情况下会执行得更好吗?我不担心启动时间,同样的模式也会被用来扫描数百万个文件。

Py3基准测试:

import time
import re

RUNS = 10000

if __name__ == '__main__':
    with open('data.php') as fh:
        testString = fh.read()

    def do():
        return "576ad4f370014dfb1d0f17b0e6855f22" in testString

    start = time.time()
    for i in range(RUNS):
        _ = do()
    duration = time.time() - start
    print("Python: %.2fs" % duration)

Go1.10基准:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "strings"
    "time"
)

const (
    runs = 10000
)

func main() {
    fname := "data.php"
    testdata := readFile(fname)
    needle := "576ad4f370014dfb1d0f17b0e6855f22"
    start := time.Now()

    for i := 0; i < runs; i++ {
        _ = strings.Contains(testdata, needle)

    }
    duration := time.Now().Sub(start)
    fmt.Printf("Go: %.2fs\n", duration.Seconds())
}

func readFile(fname string) string {
    data, err := ioutil.ReadFile(fname)
    if err != nil {
        log.Fatal(err)
    }
    return string(data)
}

data.php是一个528KB的文件,可以是found here

输出:

Go:     1.98s
Python: 0.84s
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51611862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档