Я буду розбивати свою відповідь на три частини. Профілювання, прискорення коду python через c та прискорення python через python. На мою думку, Python має одні з найкращих інструментів для того, щоб дізнатись про ефективність вашого коду, а потім просвердлити до реальних шийок пляшки. Прискорення коду без профілювання - це як спроба вбити оленя узі.
Якщо ви справді цікавитесь лише продуктами mat-vec, я рекомендую scipy.sparse .
Інструменти Python для профілювання
профіль та модулі cProfile : ці модулі дадуть вам стандартний аналіз часу виконання та функціональний стек викликів. Дуже приємно зберігати їх статистику, використовуючи модуль pstats, ви можете переглянути дані різними способами.
kernprof : цей інструмент поєднує безліч процедур для виконання таких завдань, як строка за строковим кодом
memory_profiler : цей інструмент виробляє друкований друк вашого коду по черзі.
Таймери IPython : Цяtimeit
функція дуже приємна для швидкого інтерактивного бачення відмінностей у функціях.
Прискорення Питона
Cython : cython - найшвидший спосіб взяти кілька функцій у python та отримати швидший код. Ви можете прикрасити функцію за допомогою cython-варіанту python, і він генерує код c. Це дуже важливо для керування, а також може легко посилатися на інший рукописний код у c / c ++ / fortran. На сьогоднішній день це найбільш бажаний інструмент.
ctypes : ctypes дозволить вам записати свої функції в c, а потім швидко обернути їх своїм простим оформленням коду. Він обробляє весь біль від кастингу з PyObjects та керування гілом для виклику функції c.
Існують й інші підходи до написання вашого коду на C, але всі вони дещо більше для того, щоб взяти бібліотеку C / C ++ і упакувати її в Python.
Підходи лише для Python
Якщо ви хочете залишитися в Python здебільшого, моя порада - з’ясувати, які дані ви використовуєте, і вибрати правильні типи даних для реалізації ваших алгоритмів. Мій досвід, як правило, ви будете набагато далі, оптимізуючи свої структури даних, а потім будь-який низький рівень хакету. Наприклад:
numpy : контингентний масив дуже швидкий для швидких операцій масивів
numxpr : оптимізатор виразів масивного масиву. Він дозволяє виконувати багатопотокові вирази масивів numpy, а також позбавляється від численних тимчасових номерів, створених numpy через обмеження інтерпретатора Python.
blist : реалізація списку b-tree, дуже швидка для вставки, індексації та переміщення внутрішніх вузлів списку
панди : кадри даних (або таблиці) дуже швидка аналітика на масивах.
pytables : швидкі структуровані ієрархічні таблиці (наприклад, hdf5), особливо добре для обчислень із основними і запитами до великих даних.