Я собираюсь разбить свой ответ на три части. Профилирование, ускорение кода Python с помощью C и ускорение Python с помощью Python. Я считаю, что в Python есть некоторые из лучших инструментов для анализа производительности вашего кода, а затем до реальных горловин. Ускорение кода без профилирования похоже на попытку убить оленя с помощью узи.
Если вы действительно заинтересованы только в продуктах mat-vec, я бы порекомендовал scipy.sparse .
Python инструменты для профилирования
модули profile и cProfile : эти модули предоставят вам стандартный анализ времени выполнения и стек вызовов функций. Довольно приятно сохранить их статистику, и с помощью модуля pstats вы можете просматривать данные различными способами.
kernprof : этот инструмент объединяет множество процедур для выполнения таких операций, как синхронизация кода за строкой
memory_profiler : этот инструмент производит построчную печать вашего кода.
Таймеры IPython :timeit
функция очень удобна для быстрого и быстрого просмотра различий в функциях.
Ускорение Python
Cython : Cython - это самый быстрый способ получить несколько функций в Python и получить более быстрый код. Вы можете украсить функцию с помощью варианта Python для Python, и он генерирует код c. Это очень удобно и может также легко ссылаться на другой рукописный код на c / c ++ / fortran. На сегодняшний день это наиболее предпочтительный инструмент.
ctypes : ctypes позволит вам написать свои функции в c, а затем быстро обернуть их простым украшением кода. Он обрабатывает все трудности приведения из PyObjects и управления gil для вызова функции c.
Существуют и другие подходы для написания вашего кода на C, но все они несколько больше для того, чтобы взять библиотеку C / C ++ и обернуть ее в Python.
Подходы только для Python
Если вы хотите в основном оставаться внутри Python, я советую выяснить, какие данные вы используете, и выбрать правильные типы данных для реализации ваших алгоритмов. По моему опыту, оптимизируя структуры данных, вы, как правило, получаете намного больше, чем любой хакер с низким уровнем. Например:
numpy : контингентный массив, очень быстрый для пошаговых операций с массивами
figurexpr : оптимизатор выражений с массивными массивами. Он допускает многопоточность выражений в массиве numpy, а также избавляет от многочисленных временных рядов, которые numpy создает из-за ограничений интерпретатора Python.
blist : реализация списка в виде b-дерева, очень быстрая для вставки, индексации и перемещения внутренних узлов списка
панды : фреймы данных (или таблицы) очень быстрая аналитика по массивам.
pytables : быстрые структурированные иерархические таблицы (например, hdf5), особенно полезные для вычислений вне ядра и запросов к большим данным.