Maison >développement back-end >Tutoriel Python >Pourquoi le « cin » de C est-il considérablement plus lent que le « input() » de Python pour la lecture de lignes à partir de l'entrée standard, et comment les performances peuvent-elles être améliorées ?

Pourquoi le « cin » de C est-il considérablement plus lent que le « input() » de Python pour la lecture de lignes à partir de l'entrée standard, et comment les performances peuvent-elles être améliorées ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-23 06:34:10669parcourir

Why is C  's `cin` Significantly Slower Than Python's `input()` for Reading Lines from Standard Input, and How Can Performance Be Improved?

Pourquoi la lecture des lignes depuis stdin est-elle beaucoup plus lente en C qu'en Python ?

Problème :

Lorsque l'on compare le code Python et C pour lire les lignes de chaîne d'entrée à partir de stdin, le code Python s'exécute beaucoup plus rapidement. Bien qu'il garantisse une implémentation C appropriée, l'équivalent Python le surpasse d'un ordre de grandeur.

Paramètres par défaut et appels système :

En Python, la mise en mémoire tampon d'entrée est activée par défaut. , ce qui conduit à des lectures efficaces de gros morceaux et à moins d'appels système. En revanche, les flux C sont synchronisés avec stdio, obligeant cin à ignorer la mise en mémoire tampon d'entrée et à lire les caractères individuellement. Ce choix, destiné à éviter les conflits avec les fonctions stdio, introduit par inadvertance une surcharge importante.

Optimisation des performances :

Pour améliorer les performances du C, incluez l'instruction cin.sync_with_stdio(false ) au début de main. Cela désactive la synchronisation des flux et permet une mise en mémoire tampon indépendante, améliorant considérablement la vitesse de lecture des entrées.

Options alternatives :

Une autre alternative hautes performances à cin est fgets, qui utilise des fonctions stdio. pour une lecture par entrée directe.

Résultats de comparaison :

Implementation Lines per Second
Python (default) 3,571,428
cin (default/naive) 819,672
cin (no sync) 12,500,000
fgets 14,285,714
wc (not fair comparison) 54,644,808

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn