Fat-Zer, какая версия Python у тебя? И какая у valet?
3.2 медленнее 2.7, 3.3 чуть медленнее 2.7.
UPD. Ага, уже указал...
ЗЗЫ. Хм, у меня Python отрабатывает быстрее Go.
grep sed perl awk - что быстрее для простых выборок
Кстати, возник такой вопрос. Как организовать многопоточное построчное чтение текстового файла?
Кстати, возник такой вопрос. Как организовать многопоточное построчное чтение текстового файла?
самое простое, что приходит на ум: mmap'ишь, первый поток читает с начала, второй — тычется в середину, находит конец строки и читает оттуда...
ИРЛ это даёт профит только если чтение с диска не требуется... так что отдельного потока чтения будет даже лучше в большинстве задач...
valet@valet-comp:~/Documents/all$ time ./go-grep foo all > /dev/null
real 0m10.354s
user 0m10.221s
sys 0m0.124s
valet@valet-comp:~/Documents/all$ time ./go-grep2 foo all > /dev/null
real 0m6.957s
user 0m6.852s
sys 0m0.100s
Совсем как-то медленно, че-то этот GO не очень...
Fat-Zer, спасибо за результаты - интересно.
По поводу версий:
Показать
valet@valet-comp:~/Documents/all$ grep --version
GNU grep 2.6.3
Copyright (C) 2009 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <http://gnu.org/licenses/gpl.html>
Это свободное ПО: вы можете продавать и распространять его.
Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.
valet@valet-comp:~/Documents/all$ perl --version
This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi
(with 59 registered patches, see perl -V for more detail)
Copyright 1987-2009, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
valet@valet-comp:~/Documents/all$ awk --version
GNU Awk 3.1.7
Copyright (C) 1989, 1991-2009 Free Software Foundation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
valet@valet-comp:~/Documents/all$ sed --version
GNU sed версия 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-gnu-utils@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
valet@valet-comp:~/Documents/all$ python --version
Python 2.6.6
valet@valet-comp:~/Documents/all$
И все таки - почему же grep явный лидер, что там код настолько кардинально лучше написан, что оно выигрывает. В чем секрет?
xargs, не?Кстати, возник такой вопрос. Как организовать многопоточное построчное чтение текстового файла?
По поводу версий:
awk за три года всё же улучшили, видимо...
И все таки - почему же grep явный лидер, что там код настолько кардинально лучше написан, что оно выигрывает. В чем секрет?
просто он только и умеет, что искать строчки....
из явных отличий:
grep читает из файла по 32к блоками, а остальные(кроме питона) 4к-страницами....
скорей всего это из-за того, что sedperlawk читает через stdio'шные средства, а не системные... соответственно отсюда не меньше, чем 2-й оверхед при чтении..
за остальным - надо исходники курить... мне лень...
может, у меня искаропки, не менял. Но у тебя же тоже он скоростью не выделяется.awk за три года всё же улучшили, видимо...
Это понятно. Не знаю как кто, но я почему-то думал, что из всех этих grep самый медленный, просто его все юзают потому что он самый удобный, ошибался....за остальным - надо исходники курить... мне лень...
ИРЛ это даёт профит только если чтение с диска не требуется...
Просто для эксперимента оставил в варианте на Python и GO только построчное чтение файла, дык GO оказался в несколько раз медленнее...
так что отдельного потока чтения будет даже лучше в большинстве задач...
"Одного" ты хотел сказать?
Погуглив, выяснил, что GO быстрее работает со срезами байтов, чем со строками.
package main
import (
"bufio"
"fmt"
"os"
"regexp"
)
func main() {
if len(os.Args) != 3 {
fmt.Printf("Usage: %s <substring> <filename>\n", os.Args[0])
return
}
substr := os.Args[1]
fname := os.Args[2]
f, err := os.Open(fname)
if err != nil {
return
}
defer f.Close()
r := bufio.NewReader(f)
patt, _ := regexp.Compile(substr)
for {
s, ok := r.ReadSlice('\n')
if ok != nil {
break
}
matches := patt.Match(s)
if matches {
fmt.Print(string(s))
}
}
}
Этот вариант в полтора раза быстрее... По скорости чтения слегка обошёл Python. Теперь затык в регулярке.
Про awk'и:
Есть несколько реализаций awk, которые принципиально отличаются по скорости.
Например на чтении 300МБ файла (1.5млн строк, источник) разница примерно следующая:
gawk - 0m1.871s
mawk - 0m0.469s
Есть несколько реализаций awk, которые принципиально отличаются по скорости.
Например на чтении 300МБ файла (1.5млн строк, источник) разница примерно следующая:
это то понятно... меня удивило, что между гнутыми 3-м и 4-м разница в 4 раза получается...
Это тоже бывает. Для некоторых версий awk'а сильно помогает сказать LC_ALL="C", например.
зачем искать костыли, если и так четко видно что для данной задачи этот инструмент не подходит, так как выполняет ее в разы медленнее.Для некоторых версий awk'а сильно помогает сказать LC_ALL="C", например.