8
votes

Efficacité de Python: Liste des tuples

J'ai une moyenne d'objets de base.

Ces objets de base seront placés dans des collections et ces collections seront menées autour de: triés, tronqués, etc.

Malheureusement, les n sont suffisamment importants que la consommation de mémoire soit légèrement inquiétante, et la vitesse se fait connaître.

My compréhension est que les tuples sont légèrement plus efficaces de la mémoire, car ils sont dédupliqués.

Quoi qu'il en soit, j'aimerais savoir ce que les compromis de la CPU / Mémoire des listes vs. Les tuples sont en Python 2.6 / 2.7.


1 commentaires

Qu'est-ce qu'un montant moyen? Et avez-vous profilé votre code? Montrez-nous où se trouve votre goulot d'étranglement.


7 Réponses :


1
votes

Vous ne pouvez pas trier un objet immuable - c'est-à-dire lors du tri d'un tuple, vous en créerez toujours un nouveau.


0 commentaires

16
votes

Si vous avez une tuple et une liste avec les mêmes éléments, le tuple prend moins d'espace. Puisque les tuples sont immuables, vous ne pouvez pas les trier, les ajouter, etc. Je vous recommande de regarder Cette conversation par Alex Gaynor pour une introduction rapide sur quand choisir quelle DataStructure en Python.

MISE À JOUR: En y réfléchissant d'autres, vous pouvez envisager d'optimiser l'utilisation de l'espace de vos objets, par exemple via __ slots __ ou en utilisant nomméTuple instances comme proxies au lieu des objets réels. Cela conduirait probablement à des économies beaucoup plus importantes, car vous n'avez que N d'entre eux et (Presumbaly) seulement quelques collections dans lesquelles ils apparaissent. nomméTuple en particulier est super génial; Découvrez Talk de Raymond Hettinger < / a>.


0 commentaires

2
votes

Vous ne pouvez pas les utiliser de la même manière. Les tuples sont immuables et ne prennent pas en charge l'ajout, le tri, etc. (appelant trié sur un tuple donne une liste, etc.). Les tuples sont totalement différents des listes. Toute comparaison de performance n'a donc pas de sens.


6 commentaires

Imaginons qu'ils soient tous deux utilisés comme conteneurs avec une commande d'indices pour la nonce, d'accord?


@Paul je ne comprends pas ce que vous dites. Comment cela affecterait-il que les tuples ne peuvent pas être manipulés comme vous le souhaitez.


Supposons que les algorithmes puissent être réécrites pour faire face à l'immuabilité. Avec cette hypothèse, procédons à l'analyse des listes Python contre des tuples pour une efficacité.


@Paul Dans ce cas, il n'y a pas de comparaison. Ce serait comme comparer un réglé à un dict; n'a pas de sens. Je peux cependant dire que le tuple n'était pas destiné à être utilisé de cette façon.


@Rafe: Ils sont tous deux des ensembles avec une commande d'éléments ... il fait une tonne de sens de les comparer. Je ne comprends pas vos objections dans le moins .


Les tuples @Paul ne sont pas commandés, ils sont structurés. Ils ne se comportent pas du tout comme des listes, et ne sont pas habitués à accomplir les mêmes choses. Vous devez rechercher un moyen de stocker vos données hors de mémoire plutôt que d'essayer d'utiliser une structure de données qui ne fera pas ce que vous en avez besoin,




9
votes

Comme d'autres personnes mentionnées sont immuables. Trier un tuple (par exemple, trié (myeuple) code>) renvoie une liste, que vous devez alors revenir à un tuple.

Pour trier un tuple (et le garder un tuple). doivent faire cela: p> xxx pré>

Pour trier une liste, vous devez le faire: P>

mylist = [3,2,1]
mylist.sort()


3 commentaires

Je mène autour de grandes collections d'objets. Les objets eux-mêmes vont changer. Pour la plupart, les collections sont filtrées et mappées. Un certain nombre de ces collections contiennent probablement les mêmes objets (références aux objets, vraiment). J'envisage d'utiliser tuples en tant que mécanisme pour minimiser l'utilisation de la mémoire.


Je suis d'accord! Vous prenant complètement littéralement ici: ce que je suggère que je suggère que, au lieu de faire filtre et (code> (quelle liste de retour), utilisez l'équivalent iTertools de chacun: itTools. ifilter et ithertools.imap , qui retourne itérateurs. Si vous le faites tout au long de la ligne, vous pouvez faire le résultat final être un tuple. Même la collection initiale qui est filtrée / mappée peut et devrait être un itérateur au lieu d'une liste / tuple si possible. De cette façon, vous ne générez qu'une nouvelle collection une fois que vous avez vraiment envie.


@Paulnathan dans votre commentaire ci-dessus, avez-vous voulu dire "les objets eux-mêmes" b> pas changement "? Lisait cet échange sur des objets immuables et je pensais que je le suivais, jusqu'à ce que cette phrase m'a jeté. Merci tout pour cette discussion très éducative!



3
votes

En plus de toutes ces suggestions, vous pouvez trouver que Numpy remplira vos besoins. Si vos objets sont quelque chose que les poignées engendrées par défaut (INTS, type C natif, etc.), cela serait idéal. Vous pouvez également utiliser un tableau NUMPY avec des objets personnalisés, mais cela pourrait être plus de travail que ce qu'il vaut.


0 commentaires

4
votes

Quel est le nombre (moyen, min, max) d'objets de base dans une collection?

Les tuples sont "dédupliqués" et les listes ne sont pas? Que pensez-vous que «dédupliqué» signifie dans ce contexte?

Les listes prennent plus de mémoire que des tuples, car une mémoire supplémentaire est allouée sur la présomption qu'une liste va se développer et que vous ne voulez certainement pas la mémoire réelloc () chaque fois que vous faites grand_list.append (). Toutefois, sur une machine 32 bits, le coût amorti d'un élément de liste supplémentaire est de 4 octets pour un pointeur, n octets pour l'élément lui-même et pas plus de 4 autres octets pour la mémoire supplémentaire. N est 16 octets pour un flotteur. Cela signifie qu'une liste de flotteurs prend jusqu'à 24 octets par extrait supplémentaire, contre 20 octets pour un tuple. Un "objet de base" avec n == 100 donne une comparaison de 108 Versus 104. Si un objet basé est mentionné dans deux collections, puis 58 contre 54. Quelle est la taille de votre n?

Conseil: laissez vos collections comme des listes. Concentrez-vous sur:

  • S'assurer que vos objets de base sont efficaces de mémoire

  • Utilisez des gorndants et des goodies ITERTOOLS au lieu de listes temporaires dans la mesure du possible

  • Si vous ne pouvez pas éviter d'avoir des listes temporaires, assurez-vous qu'ils sont jetés immédiatement, ils ne sont plus nécessaires. N'ayez plus besoin de savoir que la méthode de création de la méthode de création; Utilisez explicite del dès que possible.


0 commentaires