A - ACELERANDO-PROGRAMAS-CYTHON

559 days ago by jmarcellopereira

CYTHON: ACELERANDO OS PROGRAMAS

Embora o Python seja uma linguagem conveniente de alto nível, certos cálculos podem ser várias vezes mais rápidos do que em Python se eles forem implementados usando tipos estáticos em uma linguagem compilada. Alguns aspectos do Sage seriam muito lentos se eles fossem escritos inteiramente em Python. Para lidar com isso, o Sage suporta uma “versão” compilada do Python chamada Cython ([Cyt] and [Pyr]). O Cython é simultaneamente similar ao Python e ao C. A maior parte das construções em Python, incluindo “list comprehensions”, expressões condicionais, código como += são permitidos; você também pode importar código que você escreveu em outros módulos em Python. Além disso, você pode declarar variáveis em C arbitrárias, e qualquer chamada de bibliotecas em C pode ser feita diretamente. O código resultante é convertido para C e compilado usando um compilador para C

reset() 
       

Execução da serie de fibonacci para o termo 35

Julia

Python (jupyter) Sage Sage (Cython) C(terminal) Octave(GUI) Scilab(GUI) Maxima(GUI) Matlab
 0.094s  3.302s  5.720s 0.66s 0.034s  322.918s

  60.067

 98.350s  
def fiboR_SG_NORMAL(n): if n < 2: return n else: return fiboR_SG_NORMAL(n-1) + fiboR_SG_NORMAL(n-2) 
       
%time fiboR_SG_NORMAL(35) 
       
9227465
CPU time: 5.27 s,  Wall time: 5.27 s
9227465
CPU time: 5.27 s,  Wall time: 5.27 s
%cython # ao colocar int no parametro passado como valor é produzido uma otimização de código fantástica, pois aproxima do código em C def fiboR_SG_CYTHON(int n): if n < 2: return n else: return fiboR_SG_CYTHON(n-1) + fiboR_SG_CYTHON(n-2) 
%time fiboR_SG_CYTHON(35) 
       
9227465
CPU time: 0.65 s,  Wall time: 0.65 s
9227465
CPU time: 0.65 s,  Wall time: 0.65 s

Importe o arquivo .spyx e execute

Salve o arquivo .py como .spyx e Importe-o

load("/media/jmarcellopereira/MINT/home/jmarcellopereira/ESTUDOS/COMPUTACAO-CIENTIFICA-NOTEBOOKS/fiboR_SG.spyx") 
       
Compiling
/media/jmarcellopereira/MINT/home/jmarcellopereira/ESTUDOS/COMPUTACAO-CI\
ENTIFICA-NOTEBOOKS/fiboR_SG.spyx...
Compiling /media/jmarcellopereira/MINT/home/jmarcellopereira/ESTUDOS/COMPUTACAO-CIENTIFICA-NOTEBOOKS/fiboR_SG.spyx...
%time fiboR_SG(35) 
       

CPU time: 0.66 s,  Wall time: 0.67 s
CPU time: 0.66 s,  Wall time: 0.67 s

Outro exemplo

Calcular a integral de: $ f(x) = x^{2}$

plot(x^2-x,(x,0,10),figsize=(4, 3),fill=True) 
       
integrate(x^2,x,0,5).n() 
       
41.6666666666667
41.6666666666667

Integração por metodo do trapezio entre os intervalos 0 a 5 e N = 500000

def integral_NORMAL(fun,a, b, N): s = 0 dx = (b-a)/N for i in range(N): s = s + fun(a+i*dx) return n(s*dx) 
       
%time integral_NORMAL(x^2,0,5,700000) 
       
41.6665773809949
CPU time: 27.83 s,  Wall time: 27.84 s
41.6665773809949
CPU time: 27.83 s,  Wall time: 27.84 s

Compilando com o Cython

%cython def integral_CYTHON(fun,float a, float b, int N): s = 0 dx = (b-a)/N for i in range(N): s = s + fun(a+i*dx) return (s*dx) 
%time integral_CYTHON(x^2,0,5,700000) 
       
41.666577633835004
CPU time: 19.86 s,  Wall time: 19.86 s
41.666577633835004
CPU time: 19.86 s,  Wall time: 19.86 s
 
       

%%% FIM ACELERANDO PROGRAMAS COM CYTHON %%%