11
votes

En Python, pourquoi un module est-il implémenté dans C plus rapidement qu'un module python pur et comment écrivez-moi-je?

La documentation Python stipule que la raison pour laquelle cpickle est plus rapide que le cornichon est que le premier est mis en œuvre dans C. Qu'est-ce que cela signifie exactement?

Je fais un module pour des mathématiques avancées en Python, et certains calculs prennent une durée importante. Cela signifie-t-il que si mon programme est mis en œuvre en C, il peut être beaucoup plus rapide?

Je souhaite importer ce module d'autres programmes Python, comme je peux importer CPickle.

Pouvez-vous expliquer comment utiliser un module Python en C?


0 commentaires

4 Réponses :


17
votes

Vous pouvez écrire un code C rapide, puis l'utiliser dans vos scripts Python, de sorte que votre programme fonctionnera plus rapidement. [1] http://docs.python.org/extending/index.html#extending- Index

Un exemple est numpy, écrit en C ( https://numpy.org/ )

Une utilisation typique consiste à mettre en œuvre le goulot d'étranglement en C (ou à utiliser une bibliothèque écrite en C, bien sûr;)), en raison de sa vitesse et d'utiliser Python pour le code restant

[1] Au fait, c'est pourquoi CPickle est plus rapide que le cornichon

EDIT:

Jetez un oeil à Pyrex: http://www.cosc.canterbury.ac.nz/greg.egg.egg.pythron/pyrex/version/doc/about.html

'PYREX est une langue spécialement Conçu pour l'extension de Python modules. Il est conçu pour combler le écart entre le Nice, haut niveau, monde facile à utiliser de Python et le World Messy et bas niveau de C. '

Ce n'est pas le «fonctionnaire», mais cela peut être utile


2 commentaires

+1 Vous devriez comparer une mise en oeuvre pure C de vos calculs de base contre une implémentation de Python utilisant des numéros pour faire le levage lourd. Il y a de bonnes chances que la mise en œuvre engourdie soit compétitive.


+1 pour NUMPY. Il y a une très bonne chance que si NUMPY effectue ce que vous voulez, ce sera plus rapide que tout ce que vous pourriez écrire sans investir une quantité substantielle d'optimisation du code.



10
votes

Comme mentionné, NUMPY est excellent pour les calculs de vecteur. (Pourrait être mieux encore, mais le commentaire qu'il est préférable que tout ce que vous puissiez écrire sans faire de travail est définitivement vrai.)

Tout pour tout peut être facilement vectorisé, cependant, si vous avez des boucles intérieures serrées avec beaucoup d'appels de fonction (disons un algorithme fortement récursif), vous avez encore quelques options: probablement le plus populaire est CYTHON , qui vous permet d'écrire des modules et des fonctions dans une sorte de python annoté et d'obtenir une vitesse de type C lorsque vous en avez besoin.

Ou peut-être que votre temps est dominé par les appels de bibliothèque pour calculer des valises propres ou inverser des matrices ou évaluer des fonctions spéciales ou diviser de très grands nombres entiers - dont beaucoup les Sage Poignées de projet Très bien, au fait, si ce que vous faites est plus mathématique que de cruche pure - auquel cas le temps passé à Python pourrait même pas importer. Tout dépend des détails du genre de numérics que vous faites.


0 commentaires


9
votes

Lorsque vous écrivez une fonction dans Python, un nouvel objet de fonction est créé, le code de fonction est analysé et bytecompilé [et enregistré dans l'attribut "Func_code"], donc lorsque vous appelez cette fonction, l'interprète lit son bytecode et l'exécute .

Si vous écrivez la même fonction en C, après API C / Python pour le rendre disponible dans Python, l'interprète créera l'objet de fonction, mais cette fonction n'aura pas de bytecode. Lorsque l'interprète trouve un appel à cette fonction, il appelle la fonction C Real C, il s'exécute donc à la vitesse "de la machine" et non à la vitesse "Python-Machine".

Vous pouvez vérifier ces fonctions de vérification écrites dans c : xxx

Pour comprendre comment vous pouvez écrire Code C pour une utilisation Python Suivez les guides sur le site officiel.

Quoi qu'il en soit, si vous faites simplement n Calculs numériques numériques NUMPY DOIS être suffisant.


1 commentaires

Je fais quelque chose de différent que je n'ai gagné nulle part sur le Web, de toute façon cela a aidé, merci!