web-dev-qa-db-fra.com

Préférant Python sur c pour la programmation algorithmique

J'ai étudié un peu d'algorithmes et je suis envisagée de sites comme Spoj.pl Topcoder, etc. J'ai vu que les programmeurs préfèrent que C ou C++ habituellement pour la plupart des concours de programmation algorithmique.

Maintenant, j'ai eu des problèmes ces derniers temps. Je connais à la fois un peu de C et Python et lorsque vous essayez d'écrire un code, je semble préférer Python sur c pour la plupart des algorithmes. Chaque fois que je m'assieds à Écrivez un code dans CI Abandonnez-vous après environ 15 minutes parce que je le trouve trop lourd et j'ai tendance à passer à Python. Passez à PORICES POINTAIRES ET SE SE SE SE SE SE SE SE SE SE SE QUE SUR LE TEMPS IMOPIÉS PERSONNE QUE J'aurais pu réellement utiliser l'algorithme lui-même.

Maintenant, je sais et j'ai entendu parler de beaucoup de gens que c est une langue très importante et est le pain et le beurre de nombreux programmeurs là-bas.

Ce que je voulais savoir, c'était si cette approche de mine a des inconvénients/conséquences/inconvénients, etc.

Ce n'est pas un Python VS C débattre; cette question sur la manière dont cette pratique spécifique de préférence python sur C en raison de la facilité d'utilisation vous affectera ou tout autre programmateur/informatique à long terme.


J'aimerais entendre des personnes qui ont utilisé ces langues dans l'industrie/et pour développer de grands logiciels/bibliothèques, etc.

16
ffledgling

Dans mon expérience, lorsque les gens ont des difficultés excédentaires de codage d'algorithmes en C, c'est souvent parce qu'ils couplent étroitement leur gestion de la structure de données avec leur algorithme au lieu de créer des abstractions appropriées. Par exemple, manipuler manuellement les pointeurs de liste liés partout au lieu de faire Push() et pop() fonctions. Ils sont trop habitués à avoir ces abstractions qui leur sont fournies.

Bien que ce problème soit beaucoup plus évident avec des abstractions de niveau inférieur, une défaillance de l'accouplement serré et de créer des abstractions appropriées est un problème à n'importe quel niveau. Pratiquer ces compétences en C jusqu'à ce que vous puissiez faire un algorithme qui semble propre et lisible portera sur n'importe quelle langue que vous utilisez.

L'autre problème que j'ai parfois vu parmi python programmeurs est de difficulté à s'adapter à la performance à l'échelle. Certes, la performance n'est généralement pas la principale préoccupation, mais la manière la plus pythonique de mettre en œuvre un algorithme pour un algorithme relativement petit La structure de données peut empêcher votre système lorsque vous travaillez avec des gigaoctets ou plus de données. Devenir un bon programmeur C vous aide à être plus consciente de ces types de problèmes dans n'importe quelle langue.

Pouvez-vous apprendre ces compétences dans d'autres langues? Bien sûr, mais c aide en rendant beaucoup plus évident quand vous vous trompez.

Cela étant dit, j'utilise python pour la programmation algorithmique lorsque j'ai le choix, même si je suis aussi confortable dans C. Python a des caractéristiques linguistiques que Faites-vous très bien pour ce type de programmation et les différences de performance sont généralement négligeables. Je ne peux pas parler de la raison pour laquelle les autres programmeurs qui savent que les deux choisiraient C. J'imagine que beaucoup d'entre eux le font simplement se libérer de la foule.

14
Karl Bielefeldt

Les chercheurs dont l'intérêt principal ne prétend pas que la programmation préfère les langages de niveau supérieur tels que Python, car ils peuvent coder une solution plus facilement dans ces langues que, par exemple, C. Python est particulièrement bien adapté à cela parce qu'il est davantage orienté "prototypage", il s'agit de "batteries incluses" et il intègre des bibliothèques numériques telles que NUMPY et SICPY.

Si un chercheur a besoin d'une meilleure performance, ils remettront généralement l'algorithme qu'ils ont créé dans Python à un ingénieur logiciel, qui trouvera des moyens de l'optimiser (jusqu'à et, y compris, Recovering in c) .

10
Robert Harvey

Portez-vous à l'esprit Spoj.pl, la concurrence ACM et toutes les compétitions similaires sont axées sur la production de Code de travail rapide qui va être jetée juste après la compétition. TopCoder fait cela, mais dans une moindre mesure (le code est au moins correctement organisé au niveau de la conception OO).

Cependant, dans le monde réel de la programmation, presque tous les raccourcis que vous aborderiez dans des compétitions de programmation algorithmique est un anti-motif. Seulement si vous pensez cela à l'esprit, pouvez-vous faire une sorte de comparaison. Prenons votre exemple: passer un tableau multidimensionnel entre différentes fonctions. Dans un environnement de compétition, la meilleure approche serait de déclarer simplement le tableau mondial pour enregistrer le temps à enregistrer les détails d'appel appropriés (par exemple, devrais-je réussir la taille ou être déterminé?). Dans la programmation réelle, je ferais exactement le contraire.

Donc, à votre question, y a-t-il des conséquences complexes de choisir Python sur c pour les algorithmes, je dirais non. Si vous n'êtes pas uniquement intéressé par l'algorithme, vous ferez la même chose In Python et C. la mise en œuvre dans une langue fonctionnelle peut présenter des différences, mais l'algorithme est toujours identique.

Pratiquement la seule chose que vous avez gagnée en mettant en œuvre l'algorithme en C est plus de contrôle sur l'exécution et une garantie que vous utilisez uniquement des abstractions de niveau inférieur. Ce n'est pas une petite chose, puisque in Python= une grande partie de la complexité est cachée. Mais si le problème n'est pas trivial dans les abstractions de niveau supérieur, vous n'avez que la vitesse d'exécution perdue , et dans la plupart des cas, vous n'essayez pas vraiment de rendre le programme aussi vite que vous le pouvez, vous apprenez simplement.

Comme déjà suggéré, vous pouvez toujours échanger un Python mise en œuvre avec une implémentation C si Python s'avère trop lent. Mais cela arrivera probablement 2-3 Temps dans un vaste projet, il pourrait donc être une perte de temps, à moins que ce soit votre langue de choix (et vous avez indiqué que ce n'est pas).

10
K.Steff

En tant que membre de longue date de TopCoder et un utilisateur occasionnel de Spoj, je peux vous dire qu'une raison majeure de préférence de préférence C/C++ sur d'autres langues dans des compétitions est sa vitesse brute. Lorsque votre exécution de programme est chronométrée, il y a une pression énorme pour choisir la langue "la plus rapide" que vous pouvez obtenir, car elle vous donne plus de points en termes de codage de votre algorithme. Ma progression dans TC est allée de Java à C # à C++.

Cependant, cette situation est plus fréquente dans les compétitions que dans le développement quotidiennaire: bien que l'écriture de code optimal est universellement importante, l'importance relative de la finition de votre code dès que vous le pouvez et de le rendre aussi muet que possible que possible. cent cycles CPU. Si vous êtes plus à l'aise de coder quelque chose en Python, c'est très souvent une solution préférée.

De plus, Python offre des capacités de haut niveau qui ne sont pas disponibles en C++. Les construire sont souvent très chères, et parfois même impossibles (par exemple, envisagent de construire une réflexion ou un code auto-modificateur en C++. ). Dans des cas comme celle-ci s'appuyant sur une langue de niveau supérieur peut s'avérer également une solution optimale.

9
dasblinkenlight

Chaque fois que je m'assieds pour écrire un code en C, j'abandonne après environ 15 minutes parce que je le trouve trop encombrant et j'ai tendance à passer à Python.

Ce gain de productivité est la raison commune que les travaux C et C++ ont considérablement diminué.

C'est une question sur la manière dont cette pratique spécifique de préférence python sur C en raison de la facilité d'utilisation me touchera ou tout autre programmeur/informatique à long terme.

Il y a deux parties principales à cela. La première est la programmation algortihmic. Peu importe la langue que vous utilisez pour exprimer l'algorithme. Travailler avec l'algorithme lui-même et ajuster les bonnes dans les bons problèmes sont les parties clés, il n'ya donc aucun problème réel.

La deuxième partie est la productivité gains. En utilisant des choses qui vous rendent plus productive au fil du temps, c'est une bonne habitude et quelque chose qui ne fera rien d'autre que vous bénéficierez pendant votre carrière. Être capable d'exprimer les algorithmes dans différentes langues, c'est très utile, mais cette utilité s'assied davantage sur les idiomes que les langues utilisent ne sont pas nécessairement quelles sont ces langues.

En bref, Ne vous inquiétez pas pour cela. Ce que vous utilisez pour exprimer l'algorithme est beaucoup moins important que de pouvoir l'exprimer du tout.

5
Telastyn

Les avantages de l'utilisation de langages de niveau supérieur tels Python ou Ruby sont-ils (1) leur syntaxe est très proche de pseudocode et (2) leurs bibliothèques standard fournissent utiles Structures de données hors de la boîte (les batteries incluaient le concept que @RObert mentionné). Il est donc parfaitement parfait pour préférer les utiliser. Utilisez tout ce qui maximise votre productivité, au lieu de choisir une langue simplement parce qu'il est multiple ou "cool".

3
sakisk

Ce qu'il vous manquera lorsque vous manquez lors de la programmation dans les langages de niveau "plus élevés" que C/C++ apprend à la manière dont les ordinateurs fonctionnent. Vous ne pourrez pas développer de choses comme des systèmes embarqués, des systèmes opérationnels et des conducteurs matériels. Connaître c aide aussi à l'apprentissage de l'assembleur.

En outre, la grande majorité de tous les systèmes critiques de mission sont encore développés en C. Vous ne pouvez donc pas être en mesure de travailler dans plusieurs succursales logicielles (Aérospace/Automotive/Med-Tech, etc.) sans le savoir.

2
user29079

Je vous conseillerais de regarder Scala ou de clojure (mais utilisez les annotations de type). Dans certains cas, ils peuvent être aussi rapides que c, dans d'autres cas, ils sont toujours beaucoup plus plus vite puis rubis/python, tout en ayant une notation très consice et claire Contrairement à C ( IMHO ). Considérez ce code VS C:

for (i <- 1 to 100; j <- 2 until 100;
     k <- 1 to 2; if i != j) {
     //...
}

Aussi, ils ont une programmation de fonctionnement arsenal similaire à Ruby's/Python map, filter, reduce, etc. qui n'est pas aussi rapide que la récursion d'appel ou de la queue, mais il reste beaucoup plus rapide Ensuite, les langues de script entièrement dynamiques.

1
defhlt

J'aimerais entendre des personnes qui ont utilisé ces langues dans l'industrie/et pour développer de grands logiciels/bibliothèques, etc.

J'ai travaillé sur une petite partie d'une grande bibliothèque C++ pendant quelques années et j'ai écrit mon baccalauréat et ma thèse de maîtrise dans le contexte de cette bibliothèque. La bibliothèque, incidemment, est une bibliothèque d'algorithmes de bioinformatique et de structures de données.

La bibliothèque est construite en C++ car C++ est presque parfaite pour les exigences spécifiques de cette bibliothèque et pour les bibliothèques d'algorithmes en général. Si je devais développer une autre bibliothèque d'algorithmes et que le choix de la langue était à moi, je choisirais presque certainement C++.

La raison est non seulement performance, mais aussi le système de type fort qui vous donne tout d'abord plus de sécurité de type et seconde de tout cela vous donne la possibilité de laisser vos types document l'algorithme utilisé. Cela peut (dans mon expérience) améliore considérablement la lisibilité et la maintenabilité.

Cela dit, pour des doodles algorithmiques simples et des énigmes, j'utilise presque toujours Python (principalement parce que oui, il lit presque comme pseudo code), sauf si je ne souhaite expirer spécifiquement comment formuler le mieux un problème En C++. Jusqu'à présent, je n'ai pas résolu de nombreux problèmes de Spoj ni de TopCoder, donc je ne sais pas si la performance est vraiment essentielle que l'utilisation d'une langue rapide est cruciale.

Mais normalement, ce qui compte pour obtenir le algorithme droit afin de passer. Dans ces cas, Python fonctionne tout simplement bien. Par exemple, pour les problèmes d'Euler du projet (qui ne sont pas chronométrés, seule la solution correcte compte), Python= est parfaitement bien adapté.

1
Konrad Rudolph

Si une question se poursuit sur "Big O notation" et que vous essayez de mesurer cela, alors cela peut être plus difficile à faire dans Python sauf si vous en savez beaucoup plus sur comment python implémente les choses, par exemple A Python Liste n'est pas une liste liée; la tresse de Pythons est Timsort; Python GUIBAGE collecte à certains moments .. .

Je trouve toujours plus facile de connecter un programme C à ce qui est susceptible de se produire sur un processeur, mais même ici, il y a la mise en cache de processeur; tranchant du système d'exploitation; Optimisations du compilateur, etc. qui peuvent affecter mon intuition.

Je trouve plus rapide d'écrire et de déboguer Python code afin que, lorsque vous avez donné un choix, j'écrirais d'abord dans Python Concentant sur quelque chose qui a fonctionné. Avec cela Travailler Python Programme Vous pouvez souvent le trouver dans un système plus vaste et savoir non seulement que cela a fonctionné, mais aussi s'il était assez rapide ou dans quel aspect a été lent. Obtenir des données de performance réelles alors Aide lorsque vous optimisez la vitesse et vous permet de tester le Python version contre les réécroissements ultérieurs dans Python ou c ou autre.

Alors des inconvénients à l'aide de juste Python sont-ils difficiles à récolter les avantages des algorithmes qui ont été écrits en attendant de la compilation de type C dans le modèle de processeur. Les inconvénients à l'utilisation de C sont comme vous l'avez dit. : C'est un cochon à écrire et à déboguer et vous finissez par avoir à écrire vos propres bibliothèques trop souvent.

Je pense qu'il serait préférable de les utiliser à la fois (et d'autres langues), jusqu'à ce que vous ayez une idée de leur compromis. J'étais moi-même un bon codeur C mais écrivez maintenant très peu de code C original, bien que je doive encore lire (et parfois déboguer) C code dans mon travail. Bien que je préfère python, je sais et utilise toujours Perl et Awk (et SED et Grep et Tri et TCL et ...).

1
Paddy3118