primer problemaDos problemas de eficiencia extraños en Mathematica
he cronometrado el tiempo que toma para calcular las siguientes declaraciones (donde V [X] es una llamada a una función que requiere mucho tiempo):
Alice = Table[V[i],{i,1,300},{1000}];
Bob = Table[Table[V[i],{i,1,300}],{1000}]^tr;
Chris_pre = Table[V[i],{i,1,300}];
Chris = Table[Chris_pre,{1000}]^tr;
de Alice , Bob y Chris son matrices idénticas calculadas de 3 maneras ligeramente diferentes. Encuentro que Chris se computa 1000 veces más rápido que Alice y Bob.
No es sorprendente que Alice se calcule 1000 veces más lento porque, ingenuamente, la función V debe llamarse 1000 veces más que cuando se calcula Chris. Pero es muy sorprendente que Bob sea tan lento, ya que se calcula idénticamente a Chris, excepto que Chris almacena el paso intermedio Chris_pre.
¿Por qué Bob evalúa tan lentamente?
SEGUNDO PROBLEMA
Supongamos que quiero para compilar una función en Mathematica de la forma
f(x)=x+y
donde "y" es una constante fija en tiempo de compilación (pero que no preferir reemplazar directamente en el código con su numérico porque quiero poder cambiarlo fácilmente). Si y de valor real es y = 7,3, y definir
f1=Compile[{x},x+y]
f2=Compile[{x},x+7.3]
entonces f1 corre 50% más lento que f2. ¿Cómo hago que Mathematica reemplace "y" con "7.3" cuando se compila f1, de modo que f1 se ejecuta tan rápido como f2?
EDIT:
encontré una solución fea para el segundo problema:
f1=ReleaseHold[Hold[Compile[{x},x+z]]/.{z->y}]
Tiene que haber una mejor manera ...
¡Guau, muchas gracias! Esto es exactamente lo que estaba buscando. (Y me aseguraré de publicar problemas como este por separado en el futuro.) –
Usar 'With' es probablemente la forma más segura de abordar el problema dos, ya que hace una verdadera sustitución léxica antes de cualquier evaluación de su cuerpo. –
@Michael Pilat: De acuerdo. Sugerí la evaluación en el espíritu de un enfoque rápido y sucio si ya has definido 'y', pero la variable adicional temporal es definitivamente más segura. – Cascabel