¿Por qué SAS es mucho más rápido que R? Utilicé el código para encontrar los primeros k números primos en SAS y R para comparar su eficiencia, y los códigos son esencialmente los mismos, pero los resultados están fuera de mi mente.

Las declaraciones de lenguaje SAS se compilan en un código C altamente optimizado que se ejecuta de forma nativa en su sistema (ya sea una computadora portátil con Windows o un clúster Hadoop).

El tipo de bucle que está ejecutando en realidad no es particularmente recomendable o eficiente en SAS:

“La forma más común en que las personas hacen simulaciones y vuelven a muestrear planes en SAS® es, de hecho, la forma lenta e incómoda. Las personas tienden a pensar en términos de un gran bucle macro envuelto alrededor de un fragmento de código SAS, con fragmentos adicionales de código para obtener los resultados de interés y luego soldar las piezas de cada iteración. Pero SAS está diseñado para trabajar con procesamiento secundario, por lo que hay una mejor manera. Una forma más rápida. Este documento mostrará una forma más sencilla de realizar bootstrapping, jackknifing, validación cruzada y simulaciones de poblaciones establecidas “.

Consulte: Página en sas.com para un enfoque posiblemente más eficiente.

El capítulo sobre rendimiento en Advanced R de Hadley Wickham ofrece una buena introducción a las consideraciones de rendimiento de R. Aquí hay un resumen de las razones principales por las que R puede ser más lento que SAS.

  • R es lenguaje de tipo dinámico: en general, los idiomas de tipo dinámico sufren más sobrecarga que los idiomas de tipo estático.
  • Rendimiento de implementación: existen múltiples implementaciones del lenguaje de programación R. GNU-R (la implementación más popular) está escrito en C, Fortran y R. Hay otras versiones de R (vea pqR como ejemplo), que funcionan mejor que la implementación de GNU-R.
  • Código R mal escrito: pocos programadores R tienen experiencia en la optimización de software. Como otros ya han señalado, el código R citado podría optimizarse para ejecutarse más rápido.

Dicho esto, el rendimiento no lo es todo. El capítulo Conceptos básicos de la filosofía de Unix de The Art of Unix Programming de Eric Raymond proporciona algunas pautas sólidas para cualquier persona que programe. En particular, es importante recordar la Regla de Economía: el tiempo del programador es costoso; consérvelo con preferencia al tiempo de máquina.

El salario de un buen científico de datos no es barato. Si su organización está usando R, entonces invierta en computadoras portátiles o estaciones de trabajo de alto rendimiento para desarrolladores. Si esos no son lo suficientemente potentes, invierta en soluciones basadas en servidor.

bueno, en aquellos casos en que el código se basa en bucles, R en sí mismo no es nada rápido. Pero espera, puedes reescribir tu coe en C ++ y usar la biblioteca Rcpp

  biblioteca (Rcpp)

 Rcpp_code <- "
 #include  
 #include  
 #include 
 usando el espacio de nombres estándar;
 // [[Rcpp :: export]]
 Rcpp :: IntegerVector primes (int n) 
 {
 Rcpp :: IntegerVector xx (n);
 int ct = 1, num = 3, cuenta, c;

 xx [0] = 2;

 para (cuenta = 2; cuenta <= n;) 
 {
 para (c = 2; c <= (int) sqrt (num); c ++)
 {
 si (num% c == 0) 
 {
 ct = 0;
 descanso;
 }
 }
 si (ct! = 0)
 {
 xx [(cuenta-1)] = num;
 recuento ++;
 }
 ct = 1;
 num ++;
 }         
 volver xx;
 } "

 sourceCpp (code = Rcpp_code2)
 system.time (a <-primes (10000)) 

salida:

  sistema de usuario transcurrido 

    0.02 0.00 0.019 

editar: varias ejecuciones

  > system.time (a <-primes (10000))
    sistema de usuario transcurrido 
    0.02 0.00 0.02 
 > system.time (a <-primes (100000))
    sistema de usuario transcurrido 
   0.608 0.000 0.610 
 > system.time (a <-primes (1000000))
    sistema de usuario transcurrido 
  19.109 0.004 19.122 
 > 

Si hay una cosa que R tiene y SAS no tiene es flexibilidad. Y con algoritmos o funciones en las que el código se basa en bucles como ese, nada va a vencer a C o C ++ y nosotros, los usuarios de R, tenemos la suerte de tener un enlace tan bueno como Rcpp.

Revisa los círculos 2 y 3 de The R inferno.
Como dice Ricardo Vladimiro, de alguna manera vectorizar su código debería mejorar su velocidad. Todavía puede ser más lento que SAS, pero eso es un comienzo.

R hace muchas cosas para facilitarle la vida y, como todo, tiene un costo. y, en general, si está usando bucles en R, está haciendo algo mal.
Si está probando estas cosas para decidir si usar R o SAS, sugeriría R (no porque crea que es mejor que SAS) porque con la tasa de agregar paquetes y métodos va a hacer que su vida sea mucho más fácil.
En cuanto a la escala, la comunidad abierta se está poniendo al día con Revolution R, va a mejorar a partir de aquí.

Si no me equivoco, el código subyacente para SAS está escrito en C; los bucles en R no son código C, aunque las operaciones vectorizadas en R a menudo llaman C. Por lo tanto, está penalizando a R al no escribir código R idiomático.

La declaración es válida para usar una computadora de escritorio o portátil, con un número limitado de procesadores. Vea los recuerdos de un gerente de producto: BoscoR: Extendiendo R desde el escritorio a la red. Puede descargar el documento original presentado hace 3 semanas Nuestro documento BoscoR está oficialmente en línea.

Simplemente no hay comparación con el uso de una sola computadora portátil en SAS o R, frente a los envíos a una cuadrícula con 106 nodos con 64 núcleos cada uno, para un total de 6,784 núcleos. Los refinamientos del código juegan un papel mínimo.

Como puede ver aquí, el uso de R ha explotado, según informes recientes de analistas.

SAS está compilado en código C altamente optimizado. Normalmente, las personas hacen simulaciones y los planes de muestreo en SAS son rápidos. SAS está diseñado para trabajar con subprocesos, por lo que hay una mejor manera y más rápido que R.

Gracias,

Ramya

Desarrollador SAS.

Se sabe que R es lento cuando se usan bucles.

En su caso, tiene un ciclo while con un ciclo for. Refactorizar que para usar funciones de aplicación se calculará mucho más rápido.

Sin embargo, no digo que sea más rápido que SAS, ya que no tengo experiencia con SAS. Lo que estoy señalando es que su código R no está escrito para la velocidad en términos R. Para comparar la velocidad de procesamiento, debe tener el código más rápido posible en ambas plataformas o es incomparable.

No sé ni R ni SAS, pero aquí hay un pensamiento.

En el código R, tienes:
pn [l] = i

Lo que significa que está accediendo a la memoria.

En el código SAS no almacena nada; eso puede marcar la diferencia.

¿Has probado varias carreras?