Я пытаюсь преобразовать однострочники perl в pyp. Моя первая попытка была любезно дана мне как ответ на другой вопрос в качестве
pyp "mm | p if n==0 else (p[:-2] + [(int(x)%12) for x in p[-2:]]) | mm"
Однако это оказывается удивительно медленным. Если я создам тестовый файл, используя
for j in xrange(50000):
print ",".join(str(i) for i in [random.choice(xrange(1000)) for i in xrange(8)])
а затем запустить
time (cat testmedium.txt |~/.local/bin/pyp "mm | p if n==0 else (p[:-2] + [(int(x)%12) for x in p[-2:]]) | mm" > /dev/null)
я получил
real 1m27.889s
user 1m26.941s
sys 0m0.688s
Однако эквивалент в Perl почти мгновенный.
time (cat testmedium.txt |perl -l -a -F',' -p -e'if ($. > 1) { $F[6] %=12; $F[7] %= 12;$_ = join(q{,}, @F[6,7]) }' > /dev/null)
real 0m0.196s
user 0m0.192s
sys 0m0.012s
Для больших тестовых файлов разница еще более существенна.
pyp "mm | mm"
, чтобы проверить, тратит ли время сам pyp на использование каналов? - person Bakuriu   schedule 05.05.2013(int(x)%12)
наstr(int(x)%12)
наpyp
. - person Amber   schedule 05.05.2013p.split(',')
и','.join(p)
вместоmm
приводит к изменению таймингов? - person Bakuriu   schedule 05.05.2013python -c "import sys;print '\n'.join(','.join(x.split(',')) for x in sys.stdin)" < test.txt > result.txt
нет. Так что да, определенно что-то вpyp
. - person Amber   schedule 06.05.2013