Рассмотрим следующий код в golang
now := time.Now()
sec1 := now.Unix()
file, err := os.Open(file_name)
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
var parsedLine []string
for scanner.Scan() {
parsedLine = strings.Fields(scanner.Text())
}
fmt.Println(parsedLine)
now2 := time.Now()
sec2 := now2.Unix()
fmt.Println(sec2 - sec1) // takes 24 second for file1.txt
И рассмотрим эту программу на python
start = time.time()
with open(file) as f:
for line in f:
parsedLine = line.split()
end = time.time()
print end - start # takes 4.6450419426 second for file1.txt
Я вижу, что программа golang в 5 раз медленнее, чем программа на python в MacBook Pro
В частности, эта строка
parsedLine = strings.Fields(scanner.Text())
очень медленная.
Если я изменю эту строку в golang на
if strings.Contains(scanner.Text(), "string_that_never_exist") {
continue
}
// take less than 1 second
и Python на
if "string_that_never_exist" in line:
continue
# takes 2.86928987503 second
Версия Golang теперь намного быстрее, чем версия Python.
Я немного озадачен, почему strings.Fields(scanner.Text())
может быть медленнее, чем line.split()
Я чувствую, что мне не хватаетчто-то глупое, может кто-нибудь указать мне, почему версия golang занимает больше времени, чем python