Saltar al contenido

Cómo acelerar un proceso

Si encuentras algún error con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.

Solución:

[email protected][11111]/Pi // N

(*Out: 1.96501*10^7 *)

En general:

  • evitar For bucles: consulte: ¿Por qué debo evitar el bucle For en Mathematica?
  • evitar Append / AppendTo porque generan una nueva lista cada vez que agregas un elemento; en su lugar, genere listas con Table, Array, Range, Reap / Sow en cambio;
  • Ver también: Alternativas a los bucles de procedimiento e iteración sobre listas en Mathematica

Solo por algún contexto de tiempo, y para comparar For con Do:

n = 10^6; rpt = RepeatedTiming;

(For[i = 1; list = , i <= n, i++, list = list, i]; [email protected]@Flatten[list];) // rpt
(For[i = 1; list = , i <= n, i++, list = list, i]; [email protected]@Flatten[list];) // rpt

(list = ; Do[list = list, i, i, n]; [email protected]@Flatten[list];) // rpt
(list = ; Do[list = list, i, i, n]; [email protected]@Flatten[list];) // rpt

[email protected]@Range[n]; // rpt
[email protected]@Range[n]; // rpt

n (n + 1)/2.; // rpt



(* Out:

For loops: 1.35  s
           1.40  s

Do loops:  0.980 s
           0.887 s

Range:     0.01  s
           0.007 s

formula:   1 x 10^-6 s 

*)

Puede ver en la respuesta de @MarcoB la enorme velocidad posible.

Incluso para su código, si reemplaza el AppendTo con una estructura diferente, puede obtener una mejora de órdenes de magnitud.

Su código aquí – tenga en cuenta que no necesitamos l por nada.

( For[i = 1; list = , i <= 11111, i++, AppendTo[list, i/Pi]];
[email protected]@list ) //AbsoluteTiming

2.12476, 1.96501*10^7

Una ligera modificación da como resultado un factor de 100 de aceleración.

(For[i = 1; list = , i <= 11111, i++, list = list, i/Pi];
[email protected]@[email protected]) // AbsoluteTiming

0.0287278, 1.96501*10^7

n = 11111;
[email protected][11111]/Pi // N // RepeatedTiming
n (n + 1)/(2. Pi)// RepeatedTiming

0.000034, 1.96501*10^7

1,2*10^-6, 1,96501*10^7

Recuerda que puedes recomendar este ensayo si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *