Я пытаюсь преобразовать свои однострочные perl в pyp. Моя первая попытка была дана мне любезно, как ответ на другой question вПочему pyp (python) однострочный так медленно?
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
Для более крупных тестовых файлов разница еще более драматична.
Переводчики PErl и python делают * не * работают одинаково. То, что быстро с одним может быть худшим подходом в другом. Если вы сказали нам, чего вы пытаетесь достичь, мы, вероятно, могли бы обеспечить быструю питоническую версию. – Bakuriu
@Bakuriu Я думаю, что pyp-код должен делать что-то странное, так как он также использует огромный объем памяти (728 МБ?), Где я ожидаю, что он будет обрабатывать строки в значительной степени на лету.Цель состоит в основном в том, чтобы вводить введенные запятыми численные значения и выводить их в том же формате, за исключением двух чисел в каждой строке, заданной по модулю 12. Связанный вопрос содержит несколько мелких деталей. – marshall
Пробовал ли вы прокомментировать что-то вроде 'pyp" mm | mm "', чтобы проверить, действительно ли это pyp, используя «трубы»? – Bakuriu