Мой совет - полностью протестировать алгоритм в Python, прежде чем переводить его на любой другой язык (в противном случае вы рискуете преждевременно оптимизировать плохой алгоритм). Как только вы четко определили лучший интерфейс для своих проблем, вы можете выделить его для внешнего кода.
Позвольте мне объяснить.
Предположим, что ваш последний алгоритм состоит из набора чисел в формате (строка, столбец, значение) и, скажем, вычисления SVD соответствующей разреженной матрицы. Тогда вы можете оставить весь интерфейс для Python:
class Problem(object):
def __init__(self, values):
self.values = values
def solve(self):
return external_svd(self.values)
где external_svd
- это оболочка Python для подпрограммы Fortran / C / C ++, которая эффективно вычисляет svd по заданной матрице в формате (строка, столбец, значение) или что-либо еще, что плавает в вашей лодке.
Опять же, сначала попробуйте использовать numpy
и scipy
и любой другой стандартный инструмент Python. Только тогда, после того, как вы профилировали свой код, вы должны написать реальную оболочку external_svd
.
Если вы пойдете по этому пути, у вас будет модуль, который удобен для пользователя (пользователь взаимодействует с Python, а не с Fotran / C / C ++), и, что наиболее важно, вы сможете использовать разные серверные части: external_svd_lapack
, external_svd_paradiso
, external_svd_gsl
и т. Д. (По одному на каждый выбранный вами сервер).
Что касается разреженных библиотек линейной алгебры, проверьте Intel Math Kernel Library , PARADISO разреженный решатель , Harwell Subroutine Library (HSL) , называемый "MA27 ». Я успешно использовал их для решения очень редких, очень больших проблем (посмотрите страницу решателя нелинейной оптимизации IPOPT , чтобы понять, что я имею в виду)