Выбрал CL в качестве своего инструмента, потому что я уже «комфортно» с ним работаю, несмотря на то, что раньше не использовал его для сценариев, подобных оболочке.
Начальные части синтаксического анализа и CLI выполнены, попробовали некоторые тестовые данные с 1 ГБ, и это заняло около минуты. Винил PPCRE, боже, мой алгоритм, но в конце концов провел проверку работоспособности, которая просто скопировала *стандартный ввод* в *стандартный вывод*, и она показала, что большая часть времени тратится на чтение. Python сделал то же самое за пару секунд, если вообще.
Чтобы сгенерировать пример данных:
Код: Выделить всё
yes "$(printf 'A%.0s' {1..10})" | head -c 1G > sample.txt
Код: Выделить всё
#!/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))
Код: Выделить всё
#!/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
Версия Python: Python 3.13.3.
Вопрос: существует ли обходной путь или исправление этой проблемы? До сих пор CL ни разу не подводил меня с точки зрения производительности, даже при выполнении сложных вычислений он обычно оказывался быстрее, чем Python.
Подробнее здесь: https://stackoverflow.com/questions/797 ... dard-input