gpt4 book ai didi

python-3.x - Go strings.Contains() 比 Python3 慢 2 倍?

转载 作者:IT王子 更新时间:2023-10-29 02:37:11 26 4
gpt4 key购买 nike

我正在将文本模式扫描器从 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

最佳答案

为什么 Python 3 (24.79s) 比 Go (5.47s) 慢 4.5 倍?你得到了什么结果?

Python:

$ cat contains.py
import time
import re

RUNS = 10000

if __name__ == '__main__':
# The Complete Works of William Shakespeare by William Shakespeare
# http://www.gutenberg.org/files/100/100-0.txt
file = '/home/peter/shakespeare.100-0.txt' # 'data.php'
with open(file) as fh:
testString = fh.read()

def do():
return "Means to immure herself and not be seen." in testString

start = time.time()
for i in range(RUNS):
_ = do()
duration = time.time() - start
print("Python: %.2fs" % duration)
print(do())
$ python3 --version
Python 3.6.5
$ python3 contains.py
Python: 24.79s
True
$

开始:

$ cat contains.go
package main

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

const (
runs = 10000
)

func main() {
// The Complete Works of William Shakespeare by William Shakespeare
// http://www.gutenberg.org/files/100/100-0.txt
fname := `/home/peter/shakespeare.100-0.txt` // "data.php"
testdata := readFile(fname)
needle := "Means to immure herself and not be seen."
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())

fmt.Println(strings.Contains(testdata, needle))
fmt.Println(strings.Index(testdata, needle))

}

func readFile(fname string) string {
data, err := ioutil.ReadFile(fname)
if err != nil {
log.Fatal(err)
}
return string(data)
}
$ go version
go version devel +5332b5e75a Tue Jul 31 15:44:37 2018 +0000 linux/amd64
$ go run contains.go
Go: 5.47s
true
5837178
$

关于python-3.x - Go strings.Contains() 比 Python3 慢 2 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51611862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com