Um jeito divertido de calcular Fibonacci usando NumPy:from collections.abc import Callablefrom numpy import matrix, longdef fib() -> Callable: m = matrix('1, 1; 1, 0', dtype=long) def fib(n: int) -> long: return (m ** n)[0, 0] return fibfib = fib()Cythonfrom libc.stdint cimport int64_tfrom numpy cimport ndarrayfrom numpy import matrix, longcdef: ndarray m = matrix('1, 1; 1, 0', dtype=long)cpdef int64_t fib(int n): return (m ** n)[0, 0][]s[update 2015-11-28]Codigo atualizado para Python 3 e versao Cython.[/update] Nas ultimas semanas tenho desenvolvido uma aplicacao usando Cython e me surpreendi com o resultado.Comecei usando o Cython apenas para compilar codigo Python o que de fato rendeu o aumento de desempenho prometido , mas entao resolvi ir mais longe pra ver o quanto poderia extrair dessa plataforma: comecei a usar tipagem estatica, funcoes C (cdef) e depois acabei migrando minhas classes para tipos de extensao (cdef classes).A cada novo passo era perceptivel o crescimento do desempenho e da coerencia geral do codigo. Minha unica critica e quanto aos testes: o codigo fica muito dificil de ser testado, ja que nao e possivel fazer monkey-patch para colocar os mocks.Segundo a documentacao, ao compilar codigo Python com Cython, voce tem um aumento de 35% no desempenho do codigo. Usando a tipagem estatica, o aumento e de 300% e usando funcoes C e tipos de extensao o aumento e de aproximadamente 15.000%.Nao posso confirmar esses numeros, pois nao fiz medicoes exatas, mas uma fila do RabbitMQ que enchia com 6, 7 mil mensagens, encheu com 64 mil no mesmo periodo de tempo (eu estava fazendo apenas carga, sem consumir a fila).Uma coisa que gostei muito no Cython e o feeling: tem uma pegada bastante parecida com a do Objective C, o que faz sentido.Vou dar um exemplo da propria documentacao do Cython:Dado o seguinte codigo Python puro:def f(x): return x**2-xdef integrate_f(a, b, N): s = 0 dx = (b-a)/N for i in range(N): s += f(a+i*dx) return s * dxVoce pode salvar esse codigo em integrate.pyx e compila-lo assim:bash$ cythonize -ib integrate.pyxIsso ira gerar o codigo equivalente em C (integrate.c) e compila-lo na biblioteca integrate.so, que pode ser diretamente importada em Python:bash$ python>>> from integrate import integrate_f>>>Se voce tiver o IPython, pode usar o Cython no prompt:bash$ ipythonPython 2.7.9 (default, Jan 7 2015, 11:49:12) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> %load_ext Cython>>> %%cythonfrom integrate cimport integrate_fDe qualquer forma, so usando a biblioteca compilada em vez do codigo Python importado, Cython ja promete um aumento de 35% de performance o que nao me frustrou.Alem disso, podemos adicionar tipagem ao codigo: Cython e um superset em Python, ou seja, e uma linguagem em si e um codigo Python e tambem codigo valido Cython.def f(double x): return x**2-xdef integrate_f(double a, double b, int N): cdef: int i double s, dx s = 0 dx = (b-a)/N for i in range(N): s += f(a+i*dx) return s * dxSegundo a documentacao, isso garante um desempenho 4 vezes superior ao de Python.No entanto ainda e possivel otimizar mais ainda o codigo! Cython tem uma sintaxe especifica