Julia, un nuevo lenguaje para la programación científica
No sé si conocéis Julia, un lenguaje de programación orientado al cálculo científico. Os dejaré echarle un vistazo a su página.
¿Ya?
Bueno, pues estoy un poco enfadado con ellos. Me pasa un poco como a los catalanes que se quejaban de que en las fotos de ABC siempre sacaban a Jordi Pujol (todavía más) feo (de lo que por sí era): en las comparaciones no le hacen excesiva justicia a R. Me he tomado la molestia de reescribir el código para una de las comparaciones que realizan, pi_sum
, utilizando código vectorizado.
El original es
library(R.utils)
assert = function(bool) {
if (!bool) stop('Assertion failed')
}
timeit = function(name, f, ..., times=5) {
tmin = Inf
for (t in 1:times) {
t = system.time(f(...))["elapsed"]
if (t < tmin) tmin = t
}
cat(sprintf("r,%s,%.8f\n", name, tmin*1000))
}
pisum = function() {
t = 0.0
for (j in 1:500) {
t = 0.0
for (k in 1:10000) {
t = t + 1.0/(k*k)
}
}
return(t)
}
assert(abs(pisum()-1.644834071848065) < 1e-12);
timeit("pi_sum", pisum, times=1)
y tarda 10760 milisegundos en mi máquina.
El código alternativo,
pisum.cjgb <- function() {
for (j in 1:500)
t <- sum( (1:10000)^(-2) )
return(t)
}
assert(abs(pisum.cjgb()-1.644834071848065) < 1e-12);
timeit("pi_sum_cjgb", pisum.cjgb, times=1)
tarda 510 milisegundos, veinte veces menos.
En cualquier caso, me viene sorprendiendo mucho la velocidad de JavaScript. ¿Recordáis mi entrada sobre las ocho reinas? La versión en JavaScript,
<body onload="javascript:cnt=0;
function backTrack(trial,next){
if (trial.length==0){return true;}
else {
for (var i in trial){
if (Math.abs(trial.length-i)==Math.abs(next-trial[i])){
return false;
}
}
return true;
}
}
function perm(p,l){
if (l.length==0){
cnt++;document.write(cnt+'::'+p+'<br/>')
}
else {
for (var i in l){
if (backTrack(p,l[i])){
perm(p.concat(l[i]),
l.slice(0,l.indexOf(l[i])).concat(l.slice(l.indexOf(l[i])+1,l.length))
);
}
}
}
}
perm([],[1,2,3,4,5,6,7,8,9,10,11])">
</body>
(cópiese el código anterior en un fichero loquesea.html
y ábrase en el navegador) es notablemente más rápido que el equivalente en R.
¡Supongo que hay mucha más gente optimizando JavaScript —que, al fin y al cabo, es el instrumento que usa Google para entrar a tu cocina— que R!