Vou dividir minha resposta em três partes. Criação de perfil, acelerando o código python via ce acelerando o python via python. É minha opinião que o Python possui algumas das melhores ferramentas para analisar o desempenho do seu código, em seguida, detalhar os gargalos reais da garrafa. Acelerar o código sem criar perfis é como tentar matar um cervo com uma uzi.
Se você realmente estiver interessado apenas em produtos mat-vec, eu recomendaria o scipy.sparse .
Ferramentas Python para criação de perfil
módulos profile e cProfile : esses módulos fornecerão sua análise padrão do tempo de execução e pilha de chamadas de funções. É muito bom salvar suas estatísticas e, usando o módulo pstats, você pode ver os dados de várias maneiras.
kernprof : esta ferramenta reúne muitas rotinas para fazer coisas como sincronização de código linha a linha
memory_profiler : esta ferramenta produz pegada de memória de linha por linha do seu código.
Temporizadores IPython : Atimeit
função é bastante boa para ver as diferenças nas funções de uma maneira rápida e interativa.
Acelerando o Python
Cython : o cython é a maneira mais rápida de executar algumas funções em python e obter código mais rápido. Você pode decorar a função com a variante cython do python e ela gera código c. Isso é muito fácil de manutenção e também pode ser vinculado a outro código escrito à mão em c / c ++ / fortran com bastante facilidade. É de longe a ferramenta preferida hoje.
ctypes : ctypes permitirá que você escreva suas funções em ce as envolva rapidamente com a simples decoração do código. Ele lida com toda a dor de transmitir do PyObjects e gerenciar o gil para chamar a função c.
Existem outras abordagens para escrever seu código em C, mas são um pouco mais para pegar uma biblioteca C / C ++ e envolvê-la em Python.
Abordagens somente em Python
Se você deseja ficar dentro do Python principalmente, meu conselho é descobrir quais dados você está usando e escolher os tipos de dados corretos para implementar seus algoritmos. De acordo com minha experiência, você geralmente vai muito além, otimizando suas estruturas de dados e, em seguida, qualquer hack c de baixo nível. Por exemplo:
numpy : um arranjo contingente muito rápido para operações estritas de arrays
numexpr : um otimizador de expressão de matriz numpy. Ele permite expressões de array numpy multithreading e também se livra das inúmeras temporárias que o numpy cria devido a restrições do interpretador Python.
blist : uma implementação em árvore b de uma lista, muito rápida para inserir, indexar e mover os nós internos de uma lista
pandas : quadros de dados (ou tabelas) análises muito rápidas nas matrizes.
pytables : tabelas hierárquicas estruturadas rapidamente (como hdf5), especialmente boas para cálculos fora do núcleo e consultas para grandes dados.