Velocidad de IronPython vs Python con números

Tengo algunos códigos fuente de Python que manipulan listas de listas de números (por ejemplo, unos 10,000 números de punto flotante) y realiza varios cálculos sobre estos números, incluyendo una gran cantidad de numpy.linalg.norm, por ejemplo.

El tiempo de ejecución no fue un problema hasta que recientemente comenzamos a usar este código desde una interfaz de usuario de C # (ejecutar este código Python desde C # a través de IronPython). Extraje un conjunto de llamadas de función (haciendo las cosas como se describe en el primer párrafo) y descubrí que este código tarda aproximadamente 4 veces más en ejecutarse en IronPython en comparación con Python 2.7 (y esto es después de excluir el tiempo de inicio / configuración en C # / IronPython) . Estoy usando un cronómetro de C # alrededor de las repetidas llamadas de IronPython desde C # y usando el módulo de timeit alrededor de un execfile en Python 2.7 (por lo tanto, los resultados de Python incluyen más operaciones como cargar el archivo, crear los objetos, … mientras que el C # no ‘t). El primero requiere aproximadamente 4.0 segundos, mientras que el último toma aproximadamente 0.9 segundos.

¿Esperarías este tipo de diferencia? ¿Alguna idea de cómo podría resolver este problema? ¿Otros comentarios?


Editar:

Este es un ejemplo simple de código que se ejecuta aproximadamente 10 veces más lento en IronPython en mi máquina (4 segundos en Python 2.7 y 40 segundos en IronPython):

n = 700 for i in range(n-1): for j in range(i, n): dist = np.linalg.norm(np.array([i, i, i]) - np.array([j, j, j])) 

Estás usando NUMPY ?! Tienes suerte de que funcione en IronPython en absoluto! ¡El soporte se está agregando literalmente mientras hablamos!

Para ser exactos, hay un proyecto de interfaz CPython-extension-to-IronPython y hay un puerto o numpy CLR nativo. No sé cuál estás usando, pero ambas formas son órdenes de magnitud más lentas que trabajar con la versión C en CPython.

ACTUALIZAR:

El puerto de Scipy for IronPython de Enthought que aparentemente está usando apariencias abandonadas: los últimos confirmos en los repositorys vinculados tienen algunos años y también falta en http://www.scipy.org/install.html . A juzgar por el artículo, era un puerto parcial con interfaz en .NET y núcleo en C vinculado con una interfaz personalizada. El párrafo anterior lo representa, también.

Si utiliza la información de Alternativas más rápidas a numpy.argmax / argmin, que es lenta , puede obtener un poco de aceleración si limita la transferencia de datos entre el CLR y el núcleo de C.