¿Es común no usar bibliotecas para algoritmos numéricos estándar y por qué?

54

Muchos algoritmos numéricos (integración, diferenciación, interpolación, funciones especiales, etc.) están disponibles en bibliotecas de computación científica como GSL . Pero a menudo veo código con implementaciones "enrolladas a mano" de estas funciones. Para los programas pequeños que no están destinados necesariamente a la distribución pública, ¿es una práctica común entre los científicos informáticos implementar solo algoritmos numéricos (con lo que me refiero a copiar o transcribir desde un sitio web, recetas numéricas o similares) cuando los necesite? Si es así, ¿hay alguna razón particular para evitar vincularse a algo como GSL, o es simplemente más "tradición" que otra cosa?

Pregunto porque soy un gran admirador de la reutilización de código , lo que sugiere que debería intentar usar implementaciones existentes cuando sea posible. Pero tengo curiosidad por saber si hay razones por las cuales ese principio es menos valioso en la computación científica que en la programación general.


Olvidé mencionar: estoy preguntando específicamente sobre C y C ++, a diferencia de los lenguajes como Python, donde hay un beneficio claro (velocidad de ejecución) para usar una biblioteca.

David Z
fuente
14
Por un lado, no querrás reinventar la rueda. Por otro lado, la mejor manera de entender un algoritmo (y, por extensión, diagnosticar fácilmente los casos en que el algoritmo falla espectacularmente) es intentar codificar una implementación usted mismo.
JM
2
¿Reprochas cada teorema que encuentras? Tal vez le des una oportunidad y juegues con algunos casos de bebés, pero a menos que sea el foco de tu investigación, probablemente lo aceptes y sigas adelante con la vida.
dls
3
Los físicos no son programadores y no están acostumbrados a lidiar con el código de otras personas (leerlo o arreglarlo). Cuando tienen que usar el código de otros, a menudo no es un código muy bien escrito o bien comentado escrito por otros físicos, lo que nuevamente agrega a la idea de que es mejor volver a escribirlo que volver a usarlo. Esto es cierto al menos en algunos campos / comunidades, pero las actitudes están cambiando entre las personas más jóvenes. Sin embargo, no todo es malo, piense en la actitud del estudiante de CS malo que no puede hacer algo si no puede encontrar una biblioteca lo suficientemente fácil para ello.
Szabolcs

Respuestas:

45

Solía ​​implementar todo yo mismo, pero últimamente he comenzado a usar bibliotecas mucho más. Creo que hay varias ventajas muy importantes de usar una biblioteca, más allá de la cuestión de si tiene que escribir una rutina usted mismo o no. Si usas una biblioteca, obtienes

  • Código que ha sido probado por cientos / miles / más usuarios
  • Código que continuará siendo actualizado y mejorado en el futuro, sin ningún trabajo de su parte
  • Código optimizado que es más eficiente y quizás más escalable que lo que escribiría en un primer intento
  • Dependiendo de la biblioteca, al establecer una interfaz para él en su código, puede obtener acceso a muchos algoritmos que actualmente no utiliza pero que quizás desee en el futuro

En el último punto anterior, estoy pensando en grandes bibliotecas como Trilinos o PETSc . Puedo reforzar esto con un par de ejemplos personales concretos en el desarrollo de PyClaw . Aunque hubiera sido sencillo paralelizar Clawpack con llamadas MPI, elegimos usar PETSc. Esto nos permitió limitar el código paralelo en el paquete a menos de 300 líneas de Python, pero aún mejor, al poner nuestros datos en el formato de PETSc obtuvimos acceso inmediato a los solucionadores implícitos de PETSc, permitiendo el trabajo actual en un solucionador implícito en PyClaw. Como segundo ejemplo, PyClaw inicialmente incluyó la reconstrucción WENO de quinto orden con código de mano, pero finalmente decidimos confiar en PyWENOpaquete para esto. Esta fue una gran ganancia, ya que PyWENO puede generar automáticamente rutinas WENO de cualquier orden en varios idiomas.

Finalmente, si usa bibliotecas, puede contribuir de nuevo desarrollando mejoras o encontrando errores, lo que beneficiará a muchas otras personas, mientras que depurar o mejorar su propio código solo lo beneficia a usted.

David Ketcheson
fuente
55
"puede contribuir de nuevo desarrollando mejoras o encontrando errores, lo que beneficiará a muchas otras personas". - eso satisfaría tanto el impulso de "retoques / aprendizaje" como la pereza (no tener que hacer cosas que ya se hicieron). :)
JM
1
Ver también, casos extremos. Para muchos algoritmos es trivial implementar algo que "funcione", pero que no maneje correctamente una pequeña fracción de casos. Esto podría estar bien para un proyecto pequeño de una sola vez, pero no puedo contar la cantidad de veces que me han enganchado debido a condiciones patológicas en algo que yo mismo "optimicé".
meawoppl
34

Hay una sobrecarga considerable del programador involucrada en el enlace a una función de biblioteca, especialmente si esa biblioteca es nueva para el programador. A menudo es más simple reescribir algoritmos simples en lugar de descubrir los detalles de una biblioteca en particular. A medida que los algoritmos se vuelven más complejos, este comportamiento cambia.

Python se ha destacado en la reducción de esta sobrecarga con herramientas como pip / easy_install y una interfaz de estructura de datos uniforme (es decir, cada biblioteca parece tomar y producir una matriz numpy).

MRocklin
fuente
19

Uno de los proyectos en los que estoy involucrado en este momento es escribir un paquete flexible de simulación y análisis para una clase de detectores de física de partículas. Uno de los objetivos de este proyecto es proporcionar la base de código que se utilizará en estas cosas en las próximas décadas.

En este punto, ya tenemos dos docenas de dependencias, lo que hace que el proceso de compilación sea una pesadilla que ha derivado de un proyecto separado administrado desde el centro de computación de Fermilab solo para proporcionar una cadena de herramientas confiable.

Ahora imagine que encuentra la necesidad de alguna herramienta que no está en esa cadena de herramientas (me ocurrió el mes pasado). Tienes tres opciones

  1. Haz rodar el tuyo. Con todos los riesgos y molestias que implica.
  2. Raspe algún código de una biblioteca en algún lugar e inclúyalo dirigiendo en The Project. Lo que significa que debe continuar con el mantenimiento en el futuro y que tendrá que comprender el código de otra persona cuando eso suceda.
  3. Diríjase a las personas que mantienen la cadena de herramientas, pídales lo que necesita y luego espere un ciclo de lanzamiento para obtenerlo. Estos muchachos son bastante receptivos, pero tienes que defenderlo sin código de trabajo o después de haber hecho (1) o (2).

Es muy fácil elegir (1). Quizás demasiado fácil.

dmckee
fuente
Sí, las dependencias agregadas son un inconveniente significativo del uso de bibliotecas.
David Ketcheson
Las dependencias son el gran inconveniente en mi mente también
Fomite
2
Es posible que mi respuesta esté poniendo demasiado peso en el hecho de las dependencias, y no lo suficiente en el proceso burocrático para conseguir que las dependencias sean aprobadas y se instalen en grandes proyectos.
dmckee
* estás en el punto 3. (Perdón por la trampa.)
299792458
Er ... no. Dice lo que quiero decir.
dmckee
12

Creo que es bastante común, con algunos algoritmos más propensos a volver a implementarse que otros.

Hay una complicada compensación entre lo molesto que es instalar una biblioteca, lo difícil que es implementar el algoritmo usted mismo, lo difícil que es optimizarlo y lo bien que la biblioteca se adapta a sus necesidades. Además, a veces usar una biblioteca es una exageración: utilicé el algoritmo de bisección lenta en uno de mis programas porque lo llamé solo unas pocas veces y no quería agregar una biblioteca solo por eso.

¿Le resulta fácil escribir una versión bien optimizada? Si es así, es mejor que lo hagas. Obtendrá exactamente lo que necesita y no dependerá del trabajo de nadie. Pero, por supuesto, realmente necesita saber lo que está haciendo: incluso los algoritmos simples pueden ser difíciles de implementar.

Sería curioso ver un estudio sobre esto, pero desde mi perspectiva parcial, los científicos a menudo usan bibliotecas para álgebra lineal y generadores de números aleatorios, y la mayoría del código restante es casero.

PhDP
fuente
12
"Pero, por supuesto, realmente necesita saber lo que está haciendo: incluso los algoritmos simples pueden ser difíciles de implementar". - Esto no puede ser enfatizado suficientemente.
JM
10

Creo que implementar un algoritmo en lugar de usar una biblioteca a veces puede proporcionar una mejor comprensión y control del modelo. Cuando estoy codificando algún programa para cálculos científicos, es importante para mí entender lo que estoy haciendo. La implementación de los algoritmos importantes me ayuda a conocer mejor el problema y lograr un mejor control del mismo.

Por otro lado, a veces no es una tarea trivial seleccionar una biblioteca que sea necesaria para obtener una solución, por lo que es mejor buscar algoritmos ya implementados cuando esté seguro de qué está tratando de lograr y por qué lo quiere.

Si los algoritmos son complejos, codificarlos a mano le brinda la oportunidad de mejorar el rendimiento / la calidad de la solución utilizando funciones específicas de la tarea. Y a veces es necesario cambiar un poco el algoritmo, lo cual es más fácil si conoce el código que escribió y puede editarlo de la manera que desee.

gmk
fuente
1
+1 para mejorar la comprensión. Aunque esto es más un problema para sus propios algoritmos que para una rutina de biblioteca.
Faheem Mitha
8

Una respuesta es que hay tantas pequeñas variaciones en el código numérico que es realmente difícil encapsularlo en una biblioteca. Tome esto en comparación con el software web, que a menudo es fácil de instalar y tiene un conjunto claro de entradas y salidas. Creo que lo más común es que las personas agarren un marco, o una gran biblioteca que actúa como un marco (Trilinos / PETSc), y que usan ese ecosistema para obtener los beneficios de usar códigos comunitarios.

aterrel
fuente
7

Antes de decidir si usar o no bibliotecas, creo que también querrás saber cuánto ayudará el uso de una biblioteca a tu código. Si va a utilizar una biblioteca bien optimizada para un núcleo computacional clave, entonces probablemente sea mucho más eficiente que intentar escribir el suyo propio.

Sin embargo, si está escribiendo una rutina especializada que solo se llamará una vez durante la ejecución de un programa, puede que no valga la pena adaptar su código para que se ajuste al marco requerido por una biblioteca.

(Otra cosa a tener en cuenta: ¿cuánto tendrá que rediseñar para aprovechar la biblioteca? A menos que las horas de trabajo que dedica a reparar el código se compensen con las ganancias correspondientes en eficiencia o precisión numérica, es posible que no vale la pena a largo plazo. Sin embargo, idealmente, esto es algo que se planifica al diseñar inicialmente estructuras de datos y algoritmos, de modo que el "flujo" de la biblioteca se tenga en cuenta desde cero).

aeismail
fuente
6

Mis 2 centavos

Creo que es más fácil escribir en general sobre esto, en lugar de solo sobre C / C ++. Primero, las bibliotecas en lenguajes como Python no se usan necesariamente para obtener un beneficio de velocidad, incluso si eso es una consecuencia. Creo que @David cubrió las razones bastante bien.

Tomándolo desde arriba, la implementación del lenguaje en cierta medida dicta a qué bibliotecas tiene acceso. Los lenguajes de uso común en ciencia computacional incluyen C, C ++, Python, Perl, Java, Fortran y R. Ejemplos menos comunes pueden ser Ocaml y Common Lisp. Ahora, dado que la mayoría de estos lenguajes están escritos en C, tienen una interfaz de función externa natural para C. Sin embargo, no es tan fácil llamar, por ejemplo, una biblioteca Perl de Python o viceversa. Entonces, en la práctica, las personas tienden a

  1. Use una biblioteca escrita en su lenguaje de implementación, usualmente algo que es parte de las bibliotecas estándar, o de otra manera ampliamente disponible, o

  2. Llame a una biblioteca C / C ++ a través de los idiomas FFI. Esto supone que todavía no existe un contenedor, ya que si lo hace, no se puede distinguir fácilmente de (1).

(2) suele ser más difícil, ya que debe ajustar la función C / C ++ usted mismo. Además, debe agrupar la biblioteca o agregar una dependencia adicional. Por esa razón, es más probable que las personas usen las bibliotecas de idiomas incorporadas en lugar de usar GSL, por ejemplo, que está en C.

Para rutinas muy genéricas, por ejemplo, generar muestras aleatorias a partir de distribuciones o rutinas numéricas básicas como la cuadratura de integrales, es fácil y común reutilizar alguna biblioteca. A medida que la funcionalidad que uno intenta implementar se vuelve más compleja, se vuelve exponencialmente más improbable que uno encuentre la función exacta que desea en otra biblioteca, e incluso si lo hace, podría pasar mucho tiempo buscando y finalmente adaptando la función como necesario (el estilo / diseño del código podría ser un problema, por ejemplo). Y como se discutió anteriormente, uno tiene acceso a solo un subconjunto de las bibliotecas disponibles. Por otro lado, implementar un algoritmo si es complejo y no es el foco principal puede ser desalentador, y por supuesto, uno tiene que lidiar con esos molestos problemas de velocidad.

Por lo tanto, esto se convierte en un problema de optimización en el análisis de costo / beneficio. Mi experiencia es que incluso para técnicas comparativamente estándar como MCMC, generalmente termino escribiendo mi propio código, porque se adapta mejor a cómo estoy diseñando el software en general.

Por supuesto, incluso si termina sin usar el código, es posible aprender del código de otras personas. Sin embargo, no sé con qué frecuencia los científicos realmente se molestan en hacer esto. Mi impresión es que leer el código de otras personas para aprender es más una cosa de ingeniero de software.

Faheem Mitha
fuente
6

Pensando en mi curso de mecánica de segundo año, se me ocurre que parte de la razón por la que he implementado mis propias versiones de algoritmos conocidos es que me enseñaron a hacerlo de esa manera. No puedo pensar en un solo ejemplo en el que me enseñaron cómo interactuar y vincular en una biblioteca en mi educación física de pregrado. Tengo un buen recuerdo de ver por primera vez una lista de coordenadas de una pelota de golf giratoria, después de haber calculado la solución de las ecuaciones de Newton acopladas en FORTRAN. Hay una cierta emoción y satisfacción (incluso orgullo) que proviene de calcular cosas desde cero.

JxB
fuente
1
Esto es ciertamente un factor. Y ese enfoque en hacerlo usted mismo es necesario para una parte de la educación de un científico computacional. Los programadores puros lo eliminan en algún momento, pero nosotros, los tipos de ciencias, podemos pasar directamente de esa clase introductoria a un proyecto poblado casi exclusivamente por otras personas que vinieron por la misma ruta.
dmckee
5

Creo que uno debería usar bibliotecas probadas tanto como sea posible. La mayoría de las personas no son expertos en informática numérica y probablemente no podrán implementar una solución tan correcta y cuidadosamente como lo que está disponible en bibliotecas bien probadas. Dicho esto, sin embargo, a veces ocurre que no hay bibliotecas disponibles que implementen la combinación de capacidades necesarias en una aplicación determinada. He visto que esto sucede en el área técnica en la que trabajo; los códigos existentes no resolvieron todos los casos, y alguien terminó implementando un solucionador desde cero que lo hizo.

mhucka
fuente
1
Si la biblioteca no cubre todas sus necesidades, le recomendaría que extienda el código de la biblioteca y envíe un parche. De esa manera, beneficiará a muchos otros con su trabajo, y otros también probarán su código por usted. Por supuesto, esto supone que el código de la biblioteca se escribió de manera suficientemente flexible para que pueda ampliarse para satisfacer sus necesidades.
David Ketcheson
Estoy de acuerdo, esa es una gran solución, y algo que la gente debería hacer si es posible.
mhucka
5

El problema fundamental es a menudo con la interfaz entre la aplicación y la biblioteca. Un programador de aplicaciones tiene conocimiento sobre el problema que a menudo se pierde al pasar el problema (por ejemplo, como una matriz) a una biblioteca. Este conocimiento es tal que explotarlo más que compensa los beneficios de usar la biblioteca altamente optimizada. Como resultado, el programador de la aplicación "lanza" su propia implementación que explota el conocimiento.

Por lo tanto, una biblioteca realmente buena necesita que dicho conocimiento pase de la aplicación a la biblioteca, para que la biblioteca también pueda aprovecharlo.

Robert van de Geijn
fuente
3

Además de todas las cosas ya mencionadas anteriormente, repetiré mi respuesta de la pregunta "Fortran vs C ++": el activo más valioso que tiene un programador es su tiempo. Sí, las dependencias externas a menudo son incómodas. Pero pasar tiempo para volver a implementar, depurar y probar algoritmos que otros ya han implementado es casi siempre estúpido, y el resultado rara vez será tan bueno como el código escrito por expertos en un tema en particular. ¡Reutilice lo que otros han hecho!

Wolfgang Bangerth
fuente
Doy mi propia respuesta sobre este tema. Puedes aprender mucho más cuando reescribes todos los detalles. Trabajo durante 5-6 años con nubes de puntos ahora. Los primeros tres años escribí todas las funcionalidades yo mismo. La segunda mitad la pasé usando la biblioteca de nubes de puntos. No puedo probarlo, pero me considero un experto más fuerte en PCL al haber pasado los primeros tres años pensando en soluciones que otros ya proporcionaron.
Jan Hackenberg
@ JanHackenberg: sí, pero déjame ser franco: acabas de malgastar tres años de tu vida reinventando ruedas. ¡Imagina cuántas cosas nuevas podrías haber hecho si hubieras usado lo que otros han hecho!
Wolfgang Bangerth
Decidí escribir en Java en mi primer año de doctorado porque en este momento consideraba que mis habilidades de programación (no teoría en informática) eran cercanas a cero. Java seguía siendo el lenguaje que mejor practicaba. También consideré Java como una buena opción debido al fácil soporte multiplataforma. Entré en una silla sin apoyo informático en el doctorado (silvicultura tradicional). Salté a c ++ cuando me di cuenta de mi error y pude (después de publicar, no antes).
Jan Hackenberg
Por cierto, no estoy de acuerdo en vastos 3 años de mi vida. Esto significaría que solo tuve dos años útiles en la experiencia de doctorado post-doc. Hoy puedo colocar 10 mil millones de cilindros en una nube de puntos forestales y dejar que la máquina decida cuáles son buenos para representar árboles. Mis ~ 50 usuarios también pueden hacerlo. En ~ 1 hora. Todos los trucos que aprendí aprendiendo de la manera más dura y lenta. Decidí nunca aprender a usar vi, pero cuando las personas que pasan la curva de aprendizaje necesaria afirman usar la forma más eficiente de producir código, les creo.
Jan Hackenberg
2

El grupo con el que trabajo utiliza bibliotecas tanto como sea posible. Soy uno de los pocos programadores, y el resto de la gente comenzó a programar en el trabajo. Saben lo suficiente de sus propias limitaciones para saber dónde no deberían estar incursionando. IMSL es la biblioteca preferida. Cosas como GSL estarían prohibidas debido a restricciones de licencia, a pesar de que esta es una agencia federal y de todos modos regalamos nuestro software.

Tangurena
fuente
2

"La reutilización es principalmente un fenómeno social. Puedo usar el software de otra persona siempre que

  1. funciona
  2. es comprensible
  3. puede coexistir
  4. es compatible (o estoy dispuesto a hacerlo yo mismo, principalmente no lo soy)
  5. es economico
  6. Puedo encontrarlo.

"- B. Stroustrup, El lenguaje de programación C ++ 2 ed. (1991) p. 383.


fuente
1

Otros han dado varias buenas razones para usar bibliotecas y también para desarrollar sus propias rutinas.

A veces puede acelerar los cálculos para una aplicación específica porque sabe de antemano que nunca necesitará la amplia gama de valores que cubre la rutina de la biblioteca o la precisión que ofrecen esas rutinas.

Por supuesto, mucho depende de la aplicación particular y de cuántas veces se llamará a la rutina de la biblioteca. ¿Por qué llamaría a una rutina de biblioteca para las funciones de Bessel miles de millones de veces si solo necesita unas pocas cifras significativas para un pequeño rango de x, y alguna técnica más simple será suficiente para sus necesidades?

Lisístrata
fuente
0

Es poco para agregar, tenemos que reutilizar el código, se trata de la sostenibilidad del código y la contribución a la sociedad, pero eso es todo lo anterior.

La razón por la que no reutilizamos el código es que si está comenzando a programar, es difícil entender el código de otros. Es particularmente difícil con C ++ avanzado, y también puedes hacer algunos trucos en C puro.

Muy a menudo al principio, uno comprende el método, pero no como está implementado en la biblioteca, o simplemente cómo usar la biblioteca con su interfaz genérica, control de errores y convenciones, muy a menudo documentada para programadores experimentados. Esto da la ilusión de que es mejor implementar un método estándar, como la factorización LU usted mismo. Además, los nuevos programadores subestiman el valor de las pruebas de código, la validación y la portabilidad para diferentes sistemas operativos. Entonces, al final la razón es la pereza, escribir un código propio parece una solución más rápida y fácil.

La realidad es que podemos aprender más usando y leyendo código que programando usted mismo desde cero.

La pereza me conduce la mayor parte del tiempo, creo que también la mayoría de las personas. Por la misma razón, algunos escriben código desde cero y otros usan bibliotecas existentes.

Me gusta
fuente
-1

Los algoritmos de las bibliotecas proporcionan, en contraste con las implementaciones propias:

  • Son genéricos y con plantilla. Más tarde puede volver a parametrizar su implementación sin preocuparse de cambiar su propio código, que se supone que tiene muchas restricciones.
  • Hay casos guardados versus degenerados de datos de entrada. Muchos algoritmos de geometría computacional, por ejemplo, los de casco convexo, necesitan manejar, por ejemplo, la colinealidad de tres puntos. Es posible que pueda ignorar esos casos si nunca planea distribuir su código y tampoco desea reutilizar su código en el futuro con frecuencia.
  • Proporcionan la complejidad de tiempo de ejecución mínima para las configuraciones de entrada esperadas o en el peor de los casos. Los algoritmos de nivel superior tienen como ladrillos de construcción a menudo algoritmos de nivel inferior, por ejemplo, algoritmos de clasificación o tipos de datos especiales. La ordenación rápida puede ser la opción más común para ordenar datos, pero si su implementación del algoritmo tiene que garantizar n (log (n)) no puede usarla.
  • Son eficientes en el uso de la memoria
  • Se optimizan aún más el tiempo de ejecución
  • Si es compatible, mucho más cerrado para estar libre de "errores" en general, especialmente si trabaja con la rama principal. Nada está más probado que una biblioteca bien distribuida. No todos los errores se bloquean, no todos los errores producen resultados irrazonables. La implementación de su algoritmo aún podría producir resultados aceptables, pero no tan buenos como está diseñada. Cuanto menos visible es un error, menos probable es que usted, como persona sola, pueda detectarlo.

Todavía lo considero bueno cuando ingreso a un nuevo campo para implementar una versión de un algoritmo bien entendible por su cuenta. Me lleva mucho tiempo en total. Compré y leí libros, el llamado Press et al. Siempre leo mucha teoría antes y durante esas implementaciones. Y después de comprender los conceptos generales de un campo y experimentar las trampas en la práctica para mí, es hora de saltar a las mejores implementaciones de la biblioteca en todos los aspectos. Creo que se convertirá en un mejor usuario de la biblioteca si escribió un algoritmo "hello world" en el campo de las bibliotecas por su cuenta.

Si trabaja en un equipo más grande, puede que no sea su elección si su equipo usa una biblioteca específica o no. El equipo central podría tomar la decisión. Y puede haber una persona responsable del enlace de la biblioteca en su proyecto con sus propios planes de tiempo. Reescribiendo un algoritmo que puede hacer con su propia planificación del tiempo, sin depender de la decisión de otras personas.

Si está solo y desea distribuir, hay otro problema. Considero, además de muchos otros códigos fuente, el recurso más útil. Muchos a todos los informadores podrían estar de acuerdo aquí. En un campo aplicado fuera de la informática, podría ser necesario proporcionar un ejecutable precompilado en Windows. En Linux, puede configurar cosas relativamente fáciles por su cuenta en el caso de bibliotecas de uso de código abierto.

Reescribir un algoritmo por su cuenta le da libertad de licencia. Su proyecto podría no ser compatible con la licencia GPL de GSL, por ejemplo.

La licencia podría ser la única restricción que es independiente del punto de vista de los investigadores.

Jan Hackenberg
fuente
1
Es absurdo pensar que "implementar un algoritmo usted mismo" y "aprender la sintaxis de la biblioteca" "costaría el mismo tiempo". Eso ni siquiera es cierto para funciones simples como "strcat". Definitivamente no es el caso de nada que esté en LAPACK, por ejemplo, o en bibliotecas de nivel superior.
Wolfgang Bangerth
@WolfgangBangerth Gracias por los comentarios. Volví a leer lo que escribí y no quise transferir el mensaje de que las propias implementaciones pueden ser competitivas. Pero aprendí mucho. Mi "ambos podrían costar dos semanas" no fue un buen ejemplo. De hecho, me costó la última vez que "aprendí la sintaxis" 2 semanas cuando cambié de Java a C ++ y también aprendí la sintaxis básica de C ++ en este momento. Luché más con los punteros que con mi nueva biblioteca. Dos semanas en cualquiera de mis algoritmos implementados podrían haber sido el tiempo de codificación, que fue mi inversión menor (leer libros antes lleva mucho más tiempo).
Jan Hackenberg
La inversión no está en escribir un pequeño algoritmo en sí mismo. Eso es rápido, y de hecho a veces puede tomar tanto tiempo como aprender otra biblioteca. Lo que cuesta increíblemente mucho tiempo es depurar cosas y resolver todos los casos de esquina. Si usa una biblioteca bien desarrollada, sabe que si el producto matriz-vector funciona para matrices cuadradas, también funcionará para matrices rectangulares. Para su propio software, puede implementar y depurar esto, a pesar de que pensó que había terminado con la función. Volverá a la misma función muchas veces. Eso es lo que cuesta tiempo.
Wolfgang Bangerth
@WolfgangBangerth Estoy de acuerdo con todos sus argumentos. Mi único punto es que aprendes mucha más teoría cuando necesitas manejar esos casos de Corner tú mismo. Mi primera versión de mi respuesta sonó como si no hiciera ninguna diferencia. Estaba horrible cansado. Escribo en la respuesta mejorada mucho más sobre los beneficios de estabilidad de las bibliotecas. Para mí es una compensación entre el tiempo dedicado y el conocimiento ganado.
Jan Hackenberg