2009-12-01 5 views
11

¿Hay partes de NumPy y/o SciPy programadas en C/C++?¿Cuánto de NumPy y SciPy están en C?

¿Y cómo se compara la sobrecarga de llamar a C desde Python con la sobrecarga de llamar a C desde Java y/o C#?

Me pregunto si Python es una mejor opción que Java o C# para aplicaciones científicas.

Si miro el shootouts, Python pierde por un gran margen. Pero supongo que esto se debe a que no usan bibliotecas de terceros en esos puntos de referencia.

+5

El código python de shootout (por ejemplo, http://shootout.alioth.debian.org/u32/benchmark.php?test=regexdna&lang=python&id=1) no utiliza numpy/scipy. – unutbu

+2

No te olvides de Fortran. Python también juega muy bien con Fortran –

+0

@ ~ unutbu Es desconcertante que esperas que el programa regex-dna use numpy. – igouy

Respuesta

11
  1. Me gustaría cuestionar cualquier punto de referencia que no muestre la fuente de cada implementación (¿o me perdí algo)? Es muy posible que una o ambas soluciones estén mal codificadas, lo que daría lugar a una evaluación injusta del rendimiento de uno o ambos idiomas.[Editar] Vaya, ahora veo la fuente. Como otros han señalado, no está utilizando las bibliotecas NumPy/SciPy, por lo que esos puntos de referencia no lo ayudarán a tomar una decisión.
  2. Creo que la gran mayoría de NumPy y SciPy están escritos en C y envueltos en Python para facilitar su uso.
  3. Probablemente dependa de lo que esté haciendo en cualquiera de esos idiomas en cuanto a la sobrecarga que hay para una aplicación en particular.

He utilizado Python para el procesamiento y análisis de datos desde hace un par de años, así que diría que es ciertamente adecuado para su propósito.

¿Qué estás tratando de lograr al final del día? Si quieres una forma rápida de desarrollar un código legible, Python es una excelente opción y lo suficientemente rápido como para una primera puñalada en lo que sea que estés tratando de resolver.

¿Por qué no tener un bash en cada uno para un pequeño subconjunto de su problema y comparar los resultados en términos de tiempo de desarrollo y tiempo de ejecución? Entonces puede tomar una decisión objetiva basada en algunos datos relevantes ... o al menos eso es lo que haría :-)

+0

El código fuente es disponible navegando a un programa específico. Desplácese hasta la parte inferior y haga clic en uno de los enlaces "Python CPython". Un ejemplo: http://shootout.alioth.debian.org/u32/benchmark.php?test=mandelbrot&lang=python&id=5 –

+1

+1 por ahora. Después de descargar el código fuente de NumPy, puedo confirmar que está principalmente envuelto en C en Python. –

+0

Al decir "por ahora" quiero decir que es una respuesta excelente, la aceptaré si nadie produce una buena comparación de los diferentes costos de la interoperabilidad C en Python, Java y C#. Además, seguiré tus consejos y crearé prototipos de una parte de la aplicación en los 3 idiomas. –

5

Mucho de esto está escrito en C o fortran. Puede volver a escribir los bucles calientes en C (o usar una de las muchas maneras de acelerar python, boost/weave es mi favorito), pero ¿realmente importa?

Su aplicación científica se ejecutará una vez. El resto es solo depuración y desarrollo, y esos pueden ser mucho más rápidos en Python.

+1

realmente - debe hacerlo: use Python Numeric desde una consola interactiva de Python para crear algunas matrices, y realice algunas operaciones con ellas "en vivo". - Le ofrece una facilidad de uso y flexibilidad que no tiene igual en otras herramientas, lo que acelera cualquier desarrollo ya que nuevas ideas y patrones de uso se pueden probar de inmediato. La solicitud interactiva de SciPy a menudo se usa como una alternativa a MatLab y otras herramientas científicas costosas (y de alguna manera limitadas). – jsbueno

+2

"Tu aplicación científica se ejecutará una vez. El resto es solo depuración y desarrollo, y eso puede ser mucho más rápido en Python". - Normalmente estaría de acuerdo. Pero esta aplicación podría funcionar durante días o incluso semanas, por lo que reducir un poco el tiempo de procesamiento ahorrará mucho tiempo real. Se ejecutará más de una vez. –

4

Hay una mejor comparación here (no es un punto de referencia pero muestra formas de acelerar Python). NumPy está escrito principalmente en C. La principal ventaja de Python es que hay una serie de formas de muy extendiendo fácilmente su código con C (ctypes, swig, f2py)/C++ (boost.python, weave.inline, weave. blitz)/Fortran (f2py) - o simplemente agregando anotaciones tipo a Python para que pueda ser procesado a C (cython). No creo que haya muchas cosas comparativamente fáciles para C# o Java, al menos que manejen tan bien las matrices numéricas de diferentes tipos (aunque supongo que los defensores argumentarían que, dado que no tienen la penalización de rendimiento de Python, hay menos necesidad a).

+1

Tu enlace parece estar roto. Tal vez puedes reemplazarlo? –

4

La mayor parte de NumPy está en C, pero una gran parte del código C es "repetitivo" para manejar todos los detalles sucios de la interfaz Python/C. Creo que la relación C vs. Python es alrededor de 50/50 ATM para NumPy.

No estoy muy familiarizado con los detalles de bajo nivel basados ​​en vm, pero creo que el costo de la interfaz sería mayor debido a las restricciones impuestas sobre el jvm y el .clr. Una de las razones por las que Numpy es a menudo más rápido que entornos similares es la representación de la memoria y cómo las matrices se comparten/pasan entre las funciones. Mientras que la mayoría de los entornos (Matlab y R también creo) usan Copy-On-Write para pasar arreglos entre funciones, NumPy usa referencias. Pero hacerlo en, por ejemplo, la JVM sería difícil (debido a restricciones sobre cómo usar el puntero, etc.). Es factible (existe un puerto inicial de NumPy para Jython), pero no sé cómo resuelven este problema. Quizás C++/Cli lo haría más fácil, pero no tengo experiencia con ese entorno.

+0

@DavidCournapeaud pasando una matriz de C# a un dll nativo es tan fácil como pasar un puntero. De hecho, no se realiza ninguna copia (como para Java) de la matriz. La matriz _is_ pasó como referencia (fijada) con muy poca sobrecarga. – user492238

0

Siempre depende de su propia capacidad para manejar la langue, por lo que el lenguaje puede generar código rápido. Según mi experiencia, numpy es varias veces más lento que buenas implementaciones .NET. Y espero que JAVA sea similar rápido. Sus compiladores de JIT de optimización han mejorado significativamente a lo largo de los años y producen instrucciones muy eficientes.

numpy por otro lado viene con una sintaxis que es más fácil de usar para aquellos que están en sintonía con los lenguajes de scripting. Pero si se trata de desarrollo de aplicaciones, esas ventajas a menudo se convierten en obstáculos y anhelarás seguridad de tipo e IDE empresariales. Además, la brecha sintáctica ya se está cerrando con C#. Existe un número creciente de bibliotecas científicas para Java y .NET. Personalmente, me inclino por C#, porque proporciona una mejor sintaxis para matrices multidimensionales y de alguna manera se siente más 'moderno'. Pero, por supuesto, esta es solo mi experiencia personal.

Cuestiones relacionadas