пятница, 21 июля 2017 г.

Maxima. Ускорение

Каждый раз при вызове пользовательской функции Maxima выполняет её разбор, что не существенно для однократного вызова, но может сказаться при работе в цикле. Однако, есть возможность ускорить (теоретически) вычисления с помощью трансляции или компиляции функций.

Трансляцию выполняет функция 

   translate(функ1, функ2, функ3, ...)

которая принимает на вход список функций, подлежащих преобразованию в код Lisp. Если необходимо оттранслировать все функции, вызовите один из следующих вариантов:

   translate(functions)
   translate(all)

При работе с числовыми или логическими типами для большего быстродействия имеет смысл сообщить об этом с помощью функции 

   mode_declare(переменная1, тип1, переменная2, тип2, ...)

Возможны следующие типы переменных: boolean, fixnum, number, rational, float. Переменные одного типа можно задать в виде списка. Например:

   f(x) := block([s], mode_declare([function(f),x,s],float), s:1, for i:1 thru 7 do s:s+x^i, s)$
   translate(f);

Здесь результат функции, а также аргумент и переменная объявлены числами с плавающей точкой, затем определён полином 7-й степени и выполнена трансляция.

Компиляция производится с помощью функции 

   compile(...)

Она принимает такой же список аргументов, что и translate(). Разница заключается в том, что выполняется не только трансляция в Lisp, но затем и компиляция в бинарные коды.

Есть информация, что при использовании трансляции или компиляции Maxima стремится оптимизировать скорость, но правильность выражений может пострадать. Так что при возникновении странностей стоит сравнить результат с выходом "сырой" функции.

Комментариев нет:

Отправить комментарий