An Elementary Introduction to the Wolfram Language
46Cómo escribir código de buena calidad
Funciones tales como Table o NestList o FoldList existen en Wolfram Language porque se refieren a acciones que se efectúan frecuentemente. Tal y como pasa con el lenguaje natural, suele haber diferentes maneras de expresar lo mismo, pero si se quiere lograr código de buena calidad hay que encontrar la que resulte más directa y más sencilla.
Código en Wolfram Language, sencillo y de buena calidad, para formar la tabla de los 10 primeros cuadrados:
In[1]:=
Click for copyable input
Out[1]=
¿Qué necesidad habría de escribir algo diferente? Frecuentemente, no se piensa en la tabla completa, sino en los pasos que habría que seguir para construirla. En las primeras épocas de la era de la computación, las máquinas necesitaban de toda la ayuda que el programador pudiera darles, y la única opción era mediante un código que describiera paso a paso lo que tenían que hacer.
In[2]:=
Click for copyable input
Out[2]=
Wolfram Language permite expresar las cosas a un nivel más alto, y crear código que atrape la idea lo más directamente que se pueda. Una vez que se conoce el lenguaje, será mucho más eficiente operar en ese nivel y, así, escribir código más fácil de entender, tanto por las computadoras como por los seres humanos.
In[3]:=
Click for copyable input
Ejecute el código:
In[4]:=
Click for copyable input
Out[4]=
In[5]:=
Click for copyable input
Este nuevo código funciona:
In[6]:=
Click for copyable input
Out[6]=
A continuación, se simplifica el código multiplicando la lista completa de potencias de 10 al mismo tiempo:
In[7]:=
Click for copyable input
In[8]:=
Click for copyable input
In[9]:=
Click for copyable input
In[10]:=
Click for copyable input
Este nuevo enfoque también funciona:
In[11]:=
Click for copyable input
Out[11]=
In[12]:=
Click for copyable input
In[13]:=
Click for copyable input
In[14]:=
Click for copyable input
Out[14]=
In[15]:=
Click for copyable input
Out[15]=
In[16]:=
Click for copyable input
Aunque, claro, sí que funciona:
In[17]:=
Click for copyable input
Out[17]=
He aquí una sola definición en la que se combinan varios casos:
In[18]:=
Click for copyable input
In[19]:=
Click for copyable input
In[20]:=
Click for copyable input
Al estar escribiendo algún programa, sucede que hay que definir una nueva función porque se necesita en un contexto muy específico. Pero siempre vale la pena tratar de darle un nombre que se entienda fuera de ese contexto. Porque muchas veces, si no se le encuentra un buen nombre, es señal de que quizá no sea la función que haya que definir.
In[21]:=
Click for copyable input
Out[21]=
In[22]:=
Click for copyable input
Out[22]=
In[23]:=
Click for copyable input
Out[23]=
En cada nueva versión, Wolfram Language ha ido mejorando su capacidad para encontrar automáticamente la manera de ejecutar un código con mayor rapidez. Aunque, claro, siempre ayuda que los algoritmos que se vayan a usar tengan una buena estructuración.
Timing reporta el tiempo utilizado en un cómputo (en segundos), además del resultado:
In[24]:=
Click for copyable input
Out[24]=
Con las definiciones de arriba para fib, el tiempo utilizado crece muy rápidamente:
In[25]:=
Click for copyable input
Out[25]=
Redefina la función fib de modo tal que recuerde cada valor que vaya calculando:
In[26]:=
Click for copyable input
In[27]:=
Click for copyable input
En este caso, hasta el 1000, se ve que cada nuevo valor se obtiene en unos cuantos microsegundos:
In[28]:=
Click for copyable input
Out[28]=
FromDigits[list] arma un entero a partir de sus dígitos
IntegerReverse[n] invierte el orden de los dígitos de un entero
Timing[expr] efectúa un cálculo, e incluye el tiempo que toma en hacerlo
46.1Encuentre una forma más simple para Module[{a, i}, a=0; For[i=1, i1000, i++, a=i*(i+1)+a];a]»
Salida esperada:
Out[]=
46.2Encuentre una forma más simple para Module[{a, i}, a=x; For[i=1, i10, i++, a=1/(1+a)];a]»
Salida esperada:
Out[]=
46.3Encuentre una forma más simple para Module[{i, j, a}, a={}; For[i=1, i10, i++, For[j=1, j10, j++, a=Join[a, {i, j}]]];a]»
Salida esperada:
Out[]=
46.4Obtenga el gráfico con los puntos unidos del tiempo usado para realizar en el cálculo de n^n, para n hasta 10 000. »
Muestra de salida esperada:
Out[]=
46.5Produzca la gráfica con los puntos unidos del tiempo usado por Sort para ordenar Range[n] en orden aleatorio, para n hasta 200. »
Muestra de salida esperada:
Out[]=
Es la notación abreviada para i=i+1. Es la misma notación utilizada por C y muchos otros lenguajes de bajo nivel para indicar esta operación de incremento.
¿Qué hace la función For?
Se trata del análogo directo del comando for(...) en C. For[start, test, step, body] ejecuta, primero, start, luego hace la prueba test, enseguida ejecuta step, y luego body. Hace esto repetidamente hasta test ya no da True.
¿Por qué algunas porciones abreviadas de código pueden ser difíciles de entender?
Lo más frecuente es que se han ido eliminando variables, y aun funciones, de manera que al final quedan muy pocos nombres para leerse, que son los que podrían dar alguna indicación de lo que supuestamente intenta hacer el código.
¿Cuál es el mejor IDE (entorno de desarrollo integrado) para escribir código en Wolfram Language?
¿Qué es lo que mide Timing?
Use RepeatedTiming, que corre el mismo código muchas veces y promedia los tiempos resultantes. (Esto no funciona cuando el código se modifica a sí mismo, como en la última definición de fib que se dio más arriba).
Además de esforzarse por mantener el código simple, uno de ellos es no recalcular nada que ya haya sido calculado. También puede mencionarse que, cuando se tienen muchos números, puede ser una buena idea usar N para que los números estén en forma aproximada. En algunos algoritmos internos se puede escoger el PerformanceGoal deseado y lograr un equilibrio entre velocidad y exactitud. Existen, además, funciones tales como Compile que tienen como propósito que gran parte del trabajo asociado a la optimización se realice por separado, de manera mucho más rápida que si se hiciera durante el cómputo propiamente.
 
Download Notebook Version
en