Si bien estoy de acuerdo con las respuestas dadas por Reed Copsey y Alex Martelli, me gustaría señalar una diferencia más: el bloqueo de intérprete global (GIL). Si bien IronPython no tiene las limitaciones de GIL, CPython las tiene, por lo que parece que para aquellas aplicaciones en las que GIL es un cuello de botella, digamos en ciertos escenarios multinúcleo, IronPython tiene una ventaja sobre Python.NET.
De la documentación de Python.NET:
Nota importante para los integradores: Python no tiene subprocesos libres y utiliza un bloqueo de intérprete global para permitir que las aplicaciones de subprocesos múltiples interactúen de forma segura con el intérprete de Python. Hay mucha más información disponible sobre esto en la documentación de la API de Python C en el
www.python.org
sitio web.
Al incrustar Python en una aplicación administrada, debe administrar GIL de la misma manera que lo haría al incrustar Python en una aplicación C o C ++.
Antes de interactuar con cualquiera de los objetos o API proporcionados por el
Python.Runtime
espacio de nombres, el código de llamada debe haber adquirido el bloqueo del intérprete global de Python llamando al
PythonEngine.AcquireLock
método. La única excepción a esta regla es el
PythonEngine.Initialize
método, que se puede llamar al inicio sin haber adquirido el GIL.
Cuando termine de usar las API de Python, el código administrado debe llamar a un correspondiente
PythonEngine.ReleaseLock
para liberar GIL y permitir que otros subprocesos usen Python.
Los
métodos AcquireLock
y ReleaseLock
son envoltorios finos sobre las funciones PyGILState_Ensure
y
no administradas PyGILState_Release
de la API de Python, y la documentación de esas API se aplica a las versiones administradas.
Otro problema es el soporte IDE. CPython probablemente tenga mejor soporte IDE en la actualidad que IronPython, por lo que esto puede ser un factor en la elección de uno sobre el otro.