sexta-feira, 27 de janeiro de 2017

Comparando o desempenho Python x Scilab

Comparar o desempenho de dois softwares é sempre complicado, pois é difícil definir a tarefa e os termos para uma comparação justa. Aqui realizamos a seguinte tarefa: a solução de um sistema de equações lineares com N variáveis, o que inclui uma inversão de uma matriz NxN. Os dois códigos abaixo são muito similares e empregam basicamente os mesmos recursos. O ambiente de simulação foi o Ubuntu - 'Linux 3.13.0-107-generic.

O gráfico acima mostra que o Scilab conseguiu ser consistemente mais rápido. Não foi usada nenhuma técnica de otimização para ganho de velocidade. O tempo para solucionar o sistema linear é calculado pela média seis de execuções, sendo retirados desse cálculo a execução mais lenta e a mais rápida.


Código Scilab:

clc;

function tinv = tinvm(N)

A = rand(N,N,'n');
y = rand(N,1,'n');

kk=1;
mdt = 0;
mit = %inf;
mxt = 0.0;
while kk<6 br="" do=""> < 6;
    Ai = inv(A);
    C = Ai * y;
    dt = toc();
    mdt = mdt + dt;  
    if dt > mxt then
        mxt = dt; end;
    if mit > dt then
        mit = dt; end;
    kk=kk+1;
end;

mediana = (mdt - mit - mxt)/(kk-3);
tinv = mediana;
endfunction

v = [];
for kl=100:100:1400
    tt = tinvm(kl);
    disp([tt, kl]);
    v = [v, tt];
end;

kl = 100:100:1400;
plot(kl,v,'-o');


Código Python:

import numpy as np
import time as tm
import matplotlib.pyplot as plt

def tinvm(N):
    A = np.matrix(np.random.random((N,N)));
    y = np.matrix(np.random.random((N,1)));

    kk=1;
    mdt = 0;
    mxt = 0;
    mit = 999.99;
    while kk<6:
        t1 = tm.time();
        Ai = A.I;
        C = Ai * y;
        t2 = tm.time();
        dt = t2 - t1;
        mdt = mdt + dt;
        if dt > mxt:
            mxt = dt;
        if mit < dt:
            mit = dt;
        kk=kk+1;
    mediana = (mdt - mit - mxt)/(kk-3);
    return mediana

km = 100;
kt = 0;
tempos = np.zeros((14,1));
while km<1500:
    mmm = tinvm(km);
    tempos[kt] = mmm;
    kt = kt + 1;
    km = km + 100;
    print('Mediana = ',mmm);

print(tempos);
ktt = np.arange(100,1500,100); 
 
#tempos do Scilab:
temps = [0.0013333, 0.008, 0.0246667, 0.0546667, 0.1043333, 0.177, 0.274, 0.424, 0.6116667, 0.817, 1.1216667, 1.4966667, 1.9436667, 2.469];
 
plt.plot(ktt,tempos,'b-o',label = 'Python');
plt.plot(ktt,temps,'g-s',label = 'Scilab');
plt.title('Inversao de matrizes Python x Scilab');
plt.xlabel('Tamanho: N x N');
plt.ylabel('Tempo (s)');
plt.grid();
plt.legend();
plt.show();

Um comentário: