web-dev-qa-db-fra.com

Listes vs. Tuples - Quoi utiliser et quand?

J'essaie de comprendre la différence entre Lists et Tuples dans Elixir. Dans la section Types de base des guides Elixir, je comprends que:

  • Les listes sont stockées sous forme d'éléments liés
  • La mise à jour d'une liste est rapide (uniquement lors de l'ajout anticipé)
  • La récupération des éléments de la liste est lente
  • La récupération des informations de la liste (taille/longueur) est lente
  • Les éléments du tuple sont stockés ensemble
  • Obtenir des informations de tuple est rapide
  • Aller chercher les éléments de tuple est rapide
  • La modification des tuples coûte cher

Ok, tout va bien mais Je ne sais toujours pas quoi utiliser quand. Je constate que la plupart des méthodes renvoient un tuple mais que partout ailleurs, des listes sont utilisées et que de nombreuses méthodes acceptent les listes en tant qu'entrée, pas les tuples. Selon les indications ci-dessus, vous ne devriez pas utiliser Tuples pour transmettre des données, car la lecture à partir d'un tuple de valeurs données par l'utilisateur serait rapide?

J'ai aussi remarqué que Tuples ne sont pas énumérables, qu'est-ce qui se passe avec ça? Utiliser Enum avec eux ne serait-il pas plus rapide que de l'utiliser sur des listes?

Si quelqu'un pouvait m'aider à mieux les comprendre, éventuellement en donnant quelques exemples de ce qu'il faut utiliser quand, ce serait génial.

47
Sheharyar

Vous avez déjà bien résumé les différences. Dans toutes les situations où l'une de ces choses est importante, cela devrait vous aider à choisir celle qui vous convient le mieux.

La façon de le penser est que les listes sont des structures de données ouvertes et que leur taille peut varier au moment de l'exécution, tandis que la taille de Tuples est constante au moment de la compilation.

Par exemple, si vous souhaitez stocker toutes les commandes que l'utilisateur a données au cours d'une session iex, vous souhaitez une liste. La longueur de cette liste dépend du nombre de commandes fournies dans cette session. Comparez cela avec un cas d'utilisation typique pour les tuples - renvoyer {:ok, result} ou {:error, reason} à partir d'une méthode - ici, le nombre d'éléments est connu dès le départ et vous ne payez donc pas un prix inacceptable pour l'amélioration des performances de Tuples.

En ce qui concerne l'énumération - les tuples sont théoriquement des collections et la position de chaque élément est supposée aussi indiquer son rôle. Considérons un {:ok, #PID<0.336.0>} tuple - itérer dessus vous donnerait d'abord un :ok, puis un #PID<0.336.0>, il serait très étrange d'écrire une fonction agissant de manière uniforme sur ces choses.

36
Paweł Obrok

Je ne suis pas un expert mais c'est ce que je comprends:

Sous le capot, une liste est une liste chaînée. Par conséquent, il possède les caractéristiques de performance d'une liste chaînée. Autrement dit, obtenir la longueur est O(n) car je dois parcourir toute la liste. De même, une liste présente les avantages d'une liste chaînée. c'est-à-dire qu'il est facile de le faire pousser en ajoutant à l'avant. 

Je ne sais pas ce qu'est un tuple sous le capot, mais je sais que ce n'est pas une liste chaînée. Quelqu'un a demandé d'énumérer des nuplets sur la liste de diffusion de la langue Elixir en 2013 et cela fait partie de la réponse:

"Les tuples ne sont pas non plus censés être itérés, ne vous trompez pas par Le fait que vous pouvez utiliser elem/2 et size/1. Les tuples servent à Stocker plusieurs éléments d'information ensemble, ce qui n'implique pas qu'ils sont destinés à stocker une collection. "

- Peter Minten

"Une autre explication serait que les tuples sont des enregistrements de pauvres. En d'autres termes, un Tuple représente une seule donnée, une seule valeur , Bien qu'agrégée. Vous ne pouvez pas enlever un élément d'un Tuple sans changer la signification sémantique de cette valeur de Tuple particulière.

"Ceci est contraire aux listes et aux autres collections qui stockent de nombreuses valeurs indépendantes. Retirer une valeur de la liste simplement Réduit la longueur de la liste. Cela n'affecte pas la signification sémantique de "

- Alexei Sholik

En d'autres termes, juste parce qu'il y a une ressemblance superficielle entre les n-uplets et les listes, il ne faut pas présumer que le comportement est le même. 

17
Onorio Catenacci

En plus de ce qui a déjà été dit, ce qui m'a aidé à différencier un tuple de la liste est l'analogie avec une ligne dans une base de données. Si vous envisagez un tuple de cette façon, il est facile de voir comment les informations contenues dans le tuple sont liées les unes aux autres et il devient également évident de ne pas l'utiliser comme Enumerable.

12
indykid

Si vous connaissez Java:

  • Une liste est comme une LinkedList.
  • Un tuple est comme un ArrayList.
1
tbodt

Étant donné que quelqu'un a mentionné ne pas savoir à quoi ressemble un Tuple sous le capot, un Tuple serait similaire à un tableau car un tableau et des éléments Tuple stockent des éléments dans une mémoire contiguë. Ainsi, les mêmes règles suivraient lorsque vous utiliseriez un tableau sur une liste liée comme avec un tuple sur une liste dans Elixir.

0
Amit L.