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 conTable
,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)