No necesitas hacer nada más que explotar la estructura de tu problema.
En particular, no computar, ni almacenar, ni de ninguna otra forma consumir tiempo y espacio, ocupándose de las partes del cálculo que simplemente serán cero. Averigua dónde cambiarán las cosas que necesitas cambiar y sólo almacena y actualiza esos . Además, algunas personas comprimen en exceso los pasos del cálculo ("mira, lo he escrito en una línea menos de álgebra"), pero en el proceso pueden enmascarar algunas de las oportunidades de explotar el cálculo redundante. Algunos algoritmos no calculan explícitamente la ganancia de Kalman como un paso, por ejemplo, pero ahí puede haber un aumento de velocidad (he visto algunos algoritmos que la calculan implícitamente tres veces).
Además, hay otras cosas obvias que deben evitarse
-
no multiplicar por 1.
-
no añadas cero.
No me refiero a "comprueba este cálculo en el código y sáltatelo" (eso es casi inútil), me refiero a que averigües dónde habrías hecho este cálculo utilizando tu conocimiento de la estructura del problema y nunca llegues ahí en el código.
Además:
-
no calcule lo mismo dos veces (en el peor de los casos, podría considerar la memoización, pero es mucho mejor evitar siquiera considerar calcular lo que sabe que ya sabrá; no haga en el software lo que su cerebro puede anticipar fácilmente y puede simplemente evitar por completo).
Por ejemplo, si ya estás calculando una cosa, no te des la vuelta y calcules su transposición; ya la tienes (esto es un subconjunto de calcular la misma cosa dos veces).
A menudo puede haber algún tipo de estructura de bloques (o estructuras similares), a veces con algunas eficiencias entre ellos (como que un bloque esté estrechamente relacionado con otro) o dentro de los bloques (por ejemplo, simetrías o asimetrías).
Dedicar algo de tiempo a pensar en los cálculos evitables que estás haciendo puede suponer una gran diferencia. Haz primero las cosas más importantes (me refiero a las que te evitarán muchos cálculos, no a las que te llevarán más tiempo poner en práctica); puede que descubras que no necesitas obtener hasta el último gramo de ganancia cuando puedes obtener el 85% de ella por menos de la mitad del trabajo.
Pero, del mismo modo, no sobreoptimices hasta el punto de interferir en las cosas que el hardware y las librerías numéricas pueden hacer bien (esto depende de la naturaleza precisa de tu hardware y librerías). Algunas de estas cosas pueden ser sutiles, pero no te dejes llevar por pequeñas ganancias (o incluso ganancias negativas si no tienes cuidado).