Использование C / C ++ для тяжелых вычислений в Python (также MySQL)

Я реализую алгоритм в моем веб-приложении Python и включаю в себя выполнение (возможно) больших вычислений кластеризации и матрицы. Я видел, что Python может использовать библиотеки C / C ++, и думал, что было бы неплохо использовать это, чтобы ускорить процесс.

Во-первых: Существуют ли какие-либо причины или что-то еще, о чем я должен помнить при этом?

Во-вторых: у меня есть некоторое нежелание связывать C с MySQL (где я получаю данные вычислениями). Разве это оправданно?

Используйте экосистему.

Для матриц использование numpy и scipy может обеспечить примерно такой же диапазон функциональности, что и инструменты, такие как Matlab. Если вы научитесь писать идиоматический код с этими модулями, внутренние петли могут иметь место в реализациях модулей C или FORTRAN, что приводит к C-подобной общей производительности с выразительностью Python для большинства задач. Вы также можете быть заинтересованы в numexpr, который может ускорить и в некоторых случаях распараллелить выражения numpy / scipy.

Если вы должны написать интенсивные интенсивные внутренние циклы в Python, сначала подумайте об этом. Возможно, вы можете переформулировать проблему таким образом, который больше подходит для numpy / scipy. Или, может быть, вы можете использовать структуры данных, доступные в Python, для разработки лучшего алгоритма, а не для более быстрой реализации того же алгоритма. Если нет, есть Cython, который использует ограниченное подмножество Python для компиляции в машинный код.

Только в крайнем случае, и после профилирования, чтобы определить абсолютные наихудшие узкие места, вы должны подумать о написании модуля расширения в C / C ++. Существует всего лишь несколько простых способов удовлетворить подавляющее большинство требований к производительности, а числовой / математический код – это область с очень хорошей поддержкой существующей библиотеки.

Не ответ, который вы ожидали, но я был по этой дороге и посоветовал KISS:

  • Сначала сделайте работу самым простым способом .
  • Только взглянуть на ускорение событий позже или усложнить дизайн.

Существует множество других способов выражения таких слов, как « не фиксировать гипотетические проблемы, если ресурсы не ограничены ».

Поддержка cython для c ++ намного лучше, чем была. Вы можете использовать большую часть стандартной библиотеки в cython. В крайнем лучшем случае до 500 раз быстрее.

Мой опыт в том, что лучше всего использовать код cython очень тонкий и пересылать все аргументы в c ++. Гораздо проще отлаживать c ++ напрямую, и синтаксис лучше понять. Необходимость поддерживать базу кода без необходимости на трех разных языках – это боль.

Использование c ++ / cython означает, что вы должны потратить немного времени на размышления о проблемах с владением. Т.е. часто безопаснее ничего не выделять в c ++, а готовить память в python / cython. (Используйте array.array или numpy.array ). Кроме того, создайте объект c ++, завернутый в cython, который имеет функцию освобождения. Все это означает, что ваше приложение будет более хрупким, чем если оно написано только в python или c ++: вы отказываетесь от RAII / gc.

С другой стороны, ваш код python должен перевести строку для строки в современный c ++. Таким образом, это напоминает вам не использовать старомодный new или delete т. Д. В вашем новом коде на C ++, но сделать вещи быстрыми и чистыми, сохраняя абстракции на высоком уровне.

Помните также, чтобы пересмотреть предположения за вашими исходными алгоритмическими вариантами. То, что разумно для python, может быть глупо для c ++.

Наконец, python делает все значительно проще и чище и быстрее отлаживается, чем c ++. Но во многих отношениях c ++ поощряет более мощные абстракции и лучшее разделение проблем.

Когда вы программируете с помощью python и cython и c ++, он медленно начинает чувствовать худшие бит обоих подходов. Возможно, стоит кусать пулю и полностью переписать в c ++. Вы можете сохранить тестовый жгут python и использовать оригинальный дизайн в качестве прототипа / тестового стенда.