Common Lisp: проблемы с производительностью при чтении строк из *стандартного ввода*Python

Программы на Python
Anonymous
 Common Lisp: проблемы с производительностью при чтении строк из *стандартного ввода*

Сообщение Anonymous »

Коротко говоря, мне нужно обработать 100 гигабайт журналов в странном формате, а затем провести некоторый анализ результатов.
Выбрал CL в качестве своего инструмента, потому что я уже «комфортно» с ним работаю, несмотря на то, что раньше не использовал его для сценариев, подобных оболочке.
Начальные части синтаксического анализа и CLI выполнены, попробовали некоторые тестовые данные с 1 ГБ, и это заняло около минуты. Винил PPCRE, боже, мой алгоритм, но в конце концов провел проверку работоспособности, которая просто скопировала *стандартный ввод* в *стандартный вывод*, и она показала, что большая часть времени тратится на чтение. Python сделал то же самое за пару секунд, если вообще.
Чтобы сгенерировать пример данных:

Код: Выделить всё

yes "$(printf 'A%.0s' {1..10})" | head -c 1G >  sample.txt
Общий код LISP:

Код: Выделить всё

#!/usr/bin/env -S sbcl --script

(defun main ()
(loop for line = (read-line *standard-input* nil)
while line
do (write-string line)
(write-char #\NEWLINE)))

(eval-when (:execute)
(main))
Код Python:

Код: Выделить всё

#!/usr/bin/env python3

import sys

def main():
for line in sys.stdin:
sys.stdout.write(line)

if __name__ == "__main__":
main()
Для запуска:

Код: Выделить всё

time cat data/sample.txt | ./test.lisp > result_lisp.txt

# real  1m59.719s
# user  0m47.231s
# sys   1m13.008s

time cat data/sample.txt | ./test.py > result_python.txt

# real  0m9.557s
# user  0m7.688s
# sys   0m2.144s

Версия SBCL: SBCL 2.2.9.debian.
Версия Python: Python 3.13.3.
Вопрос: существует ли обходной путь или исправление этой проблемы? До сих пор CL ни разу не подводил меня с точки зрения производительности, даже при выполнении сложных вычислений он обычно оказывался быстрее, чем Python.

Подробнее здесь: https://stackoverflow.com/questions/797 ... dard-input

Вернуться в «Python»