Structures de données en Python
Tous les livres que j'ai lu sur des structures de données jusqu'à présent semblent utilisation de C/C++, et de faire un usage intensif du "manuel" pointeur de contrôle qu'ils offrent. Depuis le Python se cache une sorte de gestion de la mémoire et de collecte des ordures de l'utilisateur est-il même possible de mettre en œuvre efficace des structures de données dans cette langue, et s'il y a une raison de le faire, au lieu de l'aide de l'ins?
La plupart des C/C++ structures "heav[de famille] manuel d'utilisation de pointeurs" parce qu'ils ont, plutôt que parce qu'il est plus efficace de le faire.
OriginalL'auteur Enrico Tuvera Jr | 2009-12-31
Vous devez vous connecter pour publier un commentaire.
Python vous donne un peu de puissant, hautement optimisé structures de données, à la fois comme built-ins et dans le cadre de quelques modules de la bibliothèque standard (
list
s etdict
s, bien sûr, mais aussituple
s,set
s,array
s dans le module tableau, et quelques autres conteneurs dans le module collections).Combinaisons de ces structures de données (et peut-être certaines des fonctions de helper modules tels que heapq et traversent,) sont généralement suffisantes pour mettre en œuvre la plupart des plus riches, des structures qui peuvent être nécessaires dans la vie réelle programmation; cependant, ce n'est pas toujours le cas.
Lorsque vous avez besoin quelque chose de plus que la riche bibliothèque fournit, considérer le fait que les attributs de l'objet (et des objets dans les collections) sont essentiellement des "pointeurs" vers d'autres objets (sans l'arithmétique des pointeurs), c'est à dire, "reseatable références", en Python tout comme en Java. En Python, vous utilisez normalement un
None
valeur dans un attribut ou un élément à représenter ceNULL
signifie en C++ ounull
signifie en Java.Ainsi, par exemple, vous pourriez mettre en œuvre des arbres binaires via, par exemple:
plus de méthodes ou de fonctions pour la traversée et d'autres opérations similaires (la
__slots__
classe attribut est facultatif -- la plupart du temps une optimisation de la mémoire, pour éviter chaqueNode
exemple l'exécution de ses propres__dict__
, ce qui serait nettement plus élevé que les trois attributs requis/références).D'autres exemples de structures de données qui peuvent le mieux être représentés par des classes Python, plutôt que par la composition directe des autres Python structures, comprennent
tries
(voir, par exemple,ici) etgraphs
(voir, par exemple,ici).OriginalL'auteur Alex Martelli
Pour certains de simples structures de données (par exemple. une pile), vous pouvez simplement utiliser la builtin liste pour faire votre travail. Avec des structures plus complexes (par exemple. un filtre de bloom), vous aurez à mettre en œuvre en utilisant les primitives de la langue prend en charge.
Vous devez utiliser les fonctions internes telles que si elles servent le but de votre vraiment comme ils sont une mise au point et optimisé par une horde de personnes pendant une longue période. Le faire à partir de zéro par vous-même produira probablement inférieur à la structure de données.
Si toutefois, vous avez besoin de quelque chose qui n'est pas disponible comme primitif ou si le primitif n'est pas assez bien, vous aurez à mettre en place votre propre type.
Les détails comme l'indicateur de gestion, etc sont juste de la mise en œuvre de parler et de ne pas vraiment limite les capacités de la langue elle-même.
OriginalL'auteur Noufal Ibrahim
C/C++ structure de données livres ne sont que de tenter de vous enseigner les principes sous-jacents aux diverses structures - ils ne sont généralement pas vous conseiller d'aller et de ré-inventer la roue, par la construction de votre propre bibliothèque de piles et de listes.
Si vous êtes à l'aide de Python, C++, C#, Java, que ce soit, vous devez toujours regarder pour les construit dans les structures de données en premier. Ils seront généralement mis en œuvre en utilisant le même système de primitives que vous auriez à utiliser le faisant vous-même, mais avec l'avantage d'avoir été essayé et testé.
Uniquement lorsque la condition de structures de données ne permettent pas d'accomplir ce que vous avez besoin, et il n'y a pas une alternative fiable et bibliothèque à disposition pour vous, devriez-vous être à la recherche à construire quelque chose à partir de rien (ou à l'extension de ce qui est fourni).
OriginalL'auteur csj
Comment Python gère les objets de bas niveau n'est pas trop étrange de toute façon. Ce document devrait lever l'ambiguïté sur lui un peu; c'est, fondamentalement, tout le pointeur de la logique que vous êtes déjà familier avec.
OriginalL'auteur avpx
Avec Python, vous avez accès à un vaste assortiment de bibliothèque de modules écrits et corrigés par d'autres personnes. Les chances sont très bonnes que quelque part là-bas, il y a un module qui permet au moins d'une partie de ce que vous voulez, et les chances sont de même bon qu'il pourrait être mis en œuvre en C pour la performance.
Par exemple, si vous avez besoin de faire de la matrice de mathématiques, vous pouvez utiliser NumPy, qui a été écrit en C et Fortran.
Python est assez lent, que vous ne serez pas heureux si vous essayez d'écrire une sorte de calcul intensif de code (par exemple, une transformée de Fourier Rapide) en natif Python. D'autre part, vous pouvez obtenir un C codé de la transformée de Fourier dans le cadre de SciPy, et juste utiliser.
Je n'ai jamais eu une situation où je voulais résoudre un problème en Python et dit: "mince, je ne peux pas exprimer la structure de données dont j'ai besoin."
Si vous êtes un pionnier, et vous faites quelque chose en Python pour lesquelles il n'y a pas de module bibliothèque là-bas, alors vous pouvez essayer de l'écrire en pur Python. Si elle est assez rapide, vous sont effectuées. Si c'est trop lent, vous pouvez profil, figure où les parties lentes sont, et de les réécrire en C en utilisant le Python C API. J'ai jamais eu besoin de le faire encore.
OriginalL'auteur steveha
Il n'est pas possible de mettre en place quelque chose comme un C++ vecteur en Python, puisque vous n'avez pas de tableau de primitives le cours C/C++ n'. Cependant, quelque chose de plus compliqué peut être mis en œuvre (efficacement) sur le dessus de cela, y compris, mais non limité à: les listes chaînées, les tables de hachage, multisets, les filtres de bloom, etc.
Oui, un Python est implémenté sous la forme d'un tableau (même en tant que C++ vecteur). Ce que je dis, c'est que vous ne pouvez pas mettre en place votre propre liste de dans Python, sauf sur le dessus de l'existant.
Eh bien, la liste python de type est vraiment plus comme Java ArrayList (ie. un tableau de pointeurs d'Objet).
Vrai, mais c'est parce que Python et Java ont de référence sémantique (en ignorant Java de la gestion des primitives).
OriginalL'auteur Alex Gaynor