88 votes

IronPython vs. Python .NET

Je veux accéder à certains assemblages .NET écrits en C# à partir d'un code Python.

Une petite recherche a montré que j'avais deux choix :

Quels sont les compromis entre les deux solutions ?

71voto

Reed Copsey Points 315315

Si vous souhaitez principalement baser votre code sur le framework .NET, je vous recommande vivement IronPython vs Python.NET. IronPython est pratiquement natif .NET - il fonctionne donc parfaitement lors de l'intégration avec d'autres langages .NET.

Python.NET est une bonne solution si vous souhaitez simplement intégrer un ou deux composants de .NET dans une application python standard.

L'utilisation d'IronPython présente des différences notables, mais la plupart d'entre elles sont assez subtiles. Python.NET utilise le moteur d'exécution standard CPython. cette page Wiki est une discussion pertinente sur les différences entre les deux implémentations. Les plus grandes différences se produisent dans le coût des exceptions - ainsi, certaines des bibliothèques python standard ne sont pas aussi performantes dans IronPython en raison de leur implémentation.

11 votes

IronPython a maintenant des exceptions "légères" qui sont beaucoup plus rapides. Un test TryRaiseExcept de PyBench, qui était 60 fois plus lent, ne l'est plus que 1,6 fois. WithRaiseExcept est toujours lent, mais 4 fois plus rapide qu'auparavant. Pour la plupart des autres tests, IPy est en fait plus rapide . Comparaison des performances entre IronPython 2.7 et CPython 2.7 (complet liste des points de référence ).

30voto

Vinay Sajip Points 41286

Tout en étant d'accord avec les réponses données par Reed Copsey et Alex Martelli, j'aimerais souligner une autre différence : le verrou d'interprète global (GIL). Alors qu'IronPython n'a pas les limitations du GIL, CPython en a - il semblerait donc que pour les applications où le GIL est un goulot d'étranglement, disons dans certains scénarios multicore, IronPython a un avantage sur Python.NET.

Extrait de la documentation de Python.NET :

Note importante pour les intégrateurs : Python n'est pas free-threadé et utilise un verrouillage global de l'interpréteur pour permettre à tous les utilisateurs de s'exprimer. global de l'interpréteur pour permettre applications multithreads d'interagir d'interagir en toute sécurité avec l'interpréteur en toute sécurité. De plus amples informations sur ce sujet sont disponibles dans le document Python C API sur le site www.python.org Site web.

Lorsque vous intégrez Python dans une application vous devez gérer le GIL de la même manière que vous le feriez Python dans une application C ou C++. ou C++.

Avant d'interagir avec l'un des ou les APIs fournies par le Python.Runtime le code d'appel doit avoir acquis le global Python en appelant la fonction PythonEngine.AcquireLock méthode. Le site seule exception à cette règle est la PythonEngine.Initialize qui peut être appelée au démarrage sans sans avoir acquis le GIL.

Lorsque vous avez terminé d'utiliser les API Python, le code géré doit appeler une PythonEngine.ReleaseLock pour libérer la GIL et permettre aux autres threads d'utiliser Python.

Le site AcquireLock y ReleaseLock sont des enveloppes minces sur les méthodes non gérées PyGILState_Ensure et PyGILState_Release de l'API Python, et la documentation de ces API ces API s'appliquent à la version gérée gérées.

Un autre problème est le support IDE. CPython a probablement un meilleur support IDE qu'IronPython à l'heure actuelle, ce qui peut être un facteur dans le choix de l'un ou de l'autre.

4 votes

Le plugin PyDev Eclipse supporte CPython, IronPython et Jython.

3 votes

@Knut : Exact, mais ce n'était pas la situation lorsque j'ai écrit cette réponse.

9voto

Alex Martelli Points 330805

IronPython est ".NET-natif" -- il sera donc préférable si vous souhaitez intégrer complètement votre code Python à .NET ; Python.NET fonctionne avec Classic Python, il vous permet donc de garder votre code Python à une certaine distance de .NET. (Notez qu'avec ce code vous pouvez en fait utiliser des extensions écrites pour CPython à partir de votre code IronPython, ce n'est donc plus une condition discriminante).

6voto

jeffamaphone Points 31732

IronPython vient de Microsoft, donc je suivrais mon instinct et utiliserais celui-là en premier, car vous devez supposer qu'il sera plus agréable à utiliser avec les autres technologies MSFT.

1 votes

J'en doute puisque cela ne fait pas partie de vs20xx

1voto

Meh Points 9
  1. Ironpython est comme C# en ce sens qu'il s'appuie sur des bibliothèques statiques préconstruites alors que contrairement à C#, c'est un langage dynamique.

  2. Cpython est comme C++ comme Ironpython est un langage dynamique et a accès aux bibliothèques dynamiques ce qui se traduit par le fait d'être obligé de tout écrire.

  3. Ironpython est plus rapide que C# dans certains domaines, mais pas plus rapide que Cpython. Cependant, vous pouvez lier Ironpython à n'importe quel langage, ce qui permet de surmonter les problèmes, mais vous pouvez faire de même avec Cpython.

Un langage drôle, simple et puissant, quel que soit votre choix !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X