mac - ¿Debo aprender Fortran o C++ para extender R?
descargar mingw para codeblocks (6)
Trabajo con el aprendizaje automático con conjuntos de datos bastante grandes (todavía caben en la memoria) y he escrito algunos cálculos en R, que me parecen demasiado lentos. Por lo tanto, me gustaría reemplazar las "partes críticas" del programa con código compilado que llamaría de R. Un problema de ejemplo que tengo a mano es la implementación del algoritmo de avance-retroceso .
Mi pregunta es si debo aprender Fortran o C ++ para hacer esto. Solo necesito trabajar con vectores numéricos o matrices. Estoy interesado principalmente en qué idioma es más fácil de aprender e interfaz de R y realmente no me importa cuál se ve mejor en mi CV.
He leído el manual de extensiones R y he jugado un poco con el paquete en línea con algunos códigos simples Fortran y C ++. Mi impresión actual es que Fortran95 sería más simple de aprender, aunque el paquete Rcpp también parece muy interesante. Actualmente conozco R, Python y Matlab.
Ahora he hecho algunos experimentos en el uso de Fortran, C ++ y R y creo que estoy al menos medio listo para responder mi propia pregunta ahora. Terminé escribiendo la función diff (y algunas otras pruebas pequeñas) tanto en Fortran como en C ++ y llamándola desde R.
Para empezar, creo que cualquiera que se enfrente con este problema debería leer las extensiones Writing R , la introducción de Rcpp y las preguntas frecuentes de Rcpp .
Ahora descubrí algunos puntos importantes sobre la interconexión del código de R que aún no se han cubierto en las respuestas:
- Rcpp con el paquete en línea hace que llamar a C ++ desde R sea extremadamente fácil e incluso se ocupa de compilar la extensión (ver Preguntas frecuentes de Rcpp), puedes especificar todo lo que quieres que entre en la función y lo que quieres salir.
- El uso de Rcpp y RcppArmadillo hace posible escribir cálculos eficientes y llamarlos desde R muy fácilmente con un conocimiento muy básico de C ++.
- La interfaz R de Fortran ".Forran" es mucho más limitada, necesita usar una subrutina para hacerlo y necesita pasar todos los parámetros que desea eliminar. Eso es (como yo lo entiendo) que necesita preasignar y pasar también los vectores de resultados (o matriz) a la subrutina y la subrutina también devuelve todos los parámetros. No es tan difícil, pero es mucho más propenso a errores, tedioso y limitado.
- Si desea escribir un paquete portátil, debe usar F77, consulte aquí.
Entonces, como conclusión: para lo que necesito escribir Fortran y C ++ (con Armadillo) parece ~ igualmente fácil (o difícil), pero interconectar el código C ++ de R es mucho más fácil con Rcpp.
Escribo un poco de Fortran, un montón de Matlab, y recientemente comencé a aprender seriamente C ++. Creo que serás productivo en tu nuevo idioma antes si optas por Fortran en lugar de C ++. Sugiero esto teniendo en cuenta:
- Supongo que la mayoría de los números crujientes que desea hacer es procesar grandes conjuntos de números. Fortran es muy bueno en esto y tiene constructos de lenguaje fundamentales y funciones intrínsecas para operaciones de matriz completa (no siempre mejor rendimiento que los loops). C ++ no tiene en cuenta estas características, ya sea que tenga que programarlas usted mismo o usar una biblioteca como Boost (muy recomendada por personas mucho más conocedoras que yo).
- Muchas de las características que hacen que C ++ sea un lenguaje atractivo para una amplia gama de tipos de aplicaciones (características tales como plantillas, todo el material OO, punteros, referencias y más) no son terriblemente útiles dentro de su dominio. Sospecho que si necesitas hacer una programación ''inteligente'' lo harás en R, dejando a Fortran para un simple trabajo pesado. Fortran tiene la mayoría de esas características también, pero no son tan ampliamente utilizadas en la comunidad Fortran.
- La mentalidad de Fortran no está muy lejos de la mentalidad de Matlab, por lo que el salto de este último al primero no es enorme. En este momento, también, mi punto de vista es que aprender suficiente Fortran para ser productivo en su dominio será más rápido que aprender C ++.
- En cuanto al rendimiento relativo de Fortran y C ++: no crea nada a menos que tenga medidas frente a usted. Pero creo que debes trabajar duro e inteligentemente para que C ++ coincida con el rendimiento de Fortran. Ciertamente se puede hacer, pero creo que es más exigente con las habilidades del programador. Los compiladores de Fortran han tenido más de 50 años de trabajo y la optimización de la velocidad de ejecución es muy importante para los programadores de Fortran.
No puedo comentar en absoluto sobre la facilidad de integrar R y Fortran o C ++
Fortran es el java de HPC. Puede escribir programas muy eficientes en C ++, pero es más fácil escribir el mismo programa en Fortran, siempre que sea adecuado para el cálculo numérico. Nadie escribiría en serio una aplicación GUI en Fortran, pero en HPC es inmejorable en velocidad y concisión.
Fortran fue el primer lenguaje de programación que aprendí, desde entonces también he recogido C y algo de C ++. Mi granito de arena es que si necesita acelerar rápidamente el procesamiento de la matriz, definitivamente vaya con Fortran. Las razones son:
Fortran es muy bueno en el procesamiento eficiente de datos numéricos, especialmente cuando se almacena en matrices o matrices. Este tipo de trabajo es el "punto ideal" del lenguaje.
Debido a que Fortran tiene un enfoque estrecho en las operaciones numéricas, tiene una curva de aprendizaje más baja en comparación con C y C ++. Hay menos características de lenguaje y peculiaridades para aprender y no tiene que lidiar con punteros. Esta es una gran ganancia si todo lo que quiere hacer es acelerar algunos cálculos lo más rápido posible y continuar con su trabajo.
Las matrices multidimensionales y las operaciones de matriz son ciudadanos de primera clase en el idioma Fortran. Con C o C ++, debe preocuparse por usar bibliotecas externas o escribir funciones / macros para proporcionar la misma funcionalidad.
Por otro lado, C y C ++ son decididamente más adecuados para tareas de programación de propósito general fuera del ámbito de la computación numérica. Si ve la posibilidad de algo así como mucha manipulación de cuerdas en su futuro, entonces probablemente quiera invertir su tiempo en un idioma que no sea Fortran.
Actualizar
Otra consideración importante es cómo se almacenan y procesan sus datos en el lado R. Si usa Fortran, tendrá que pasar sus datos a las rutinas compiladas de una manera muy básica: escalares, vectores, etc. Sin listas ni objetos sofisticados.
Como R se implementa en C, hay una interfaz más completa disponible que le permite pasar directamente objetos R arbitrarios a rutinas C y C ++ y luego devolver objetos R arbitrarios. También puede ejecutar devoluciones de llamada que le permiten ejecutar funciones R desde dentro del código C compilado.
Si estás en la academia, mucha gente todavía usa Fortran, por lo que podría ser una buena ventaja. Y fortran es realmente bueno para masticar números.
Si va a escribir todo el código usted mismo, entonces puede depender de qué idioma le guste más, o puede aprender mejor / más rápido. Aunque Rcpp puede darte ventaja para conseguir objetos R a C ++ y volver más fácilmente. Además, las adiciones más recientes en 0.8.3 le dan expresiones vectoriales similares a R en código compilado.
Por otro lado, si planeas usar / reutilizar / adaptar las bibliotecas existentes, entonces echaré un vistazo a p.ej. mloss.org y veré qué idioma te proporciona las bibliotecas de aprendizaje automático más útiles y también guiaré tu decisión.
Para mí, C ++ ofrece abstracciones bastante útiles además de acceso a una enorme base de código de buena calidad general. Pero otros están contentos con Fortran. Realmente depende de usted y, en cierta medida, de las personas a su alrededor que pueden brindarle apoyo.