76 votes

Quand utiliser une séquence en F# par opposition à une liste ?

Je comprends qu'un liste contient effectivement des valeurs, et un séquence est un alias pour IEnumerable<T> . Dans la pratique du développement F#, quand dois-je utiliser une séquence plutôt qu'une liste ?

Voici quelques raisons pour lesquelles je vois qu'une séquence serait préférable :

  • Lors de l'interaction avec d'autres langages .NET ou des bibliothèques qui requièrent IEnumerable<T> .
  • Nécessité de représenter une séquence infinie (probablement pas vraiment utile en pratique).
  • Besoin d'une évaluation paresseuse.

Y en a-t-il d'autres ?

89voto

Tomas Petricek Points 118959

Je pense que votre résumé pour savoir quand choisir Seq est assez bon. Voici quelques points supplémentaires :

  • Utilisez Seq par défaut lors de l'écriture de fonctions, car elles fonctionnent alors avec n'importe quelle collection .NET.
  • Utilisez Seq si vous avez besoin de fonctions avancées comme Seq.windowed o Seq.pairwise

Je pense que choisir Seq par défaut est la meilleure option, alors quand choisirais-je un autre type ?

  • Utilisez List lorsque vous avez besoin d'un traitement récursif en utilisant le head::tail motifs
    (pour implémenter une fonctionnalité qui n'est pas disponible dans la bibliothèque standard)

  • Utilisez List lorsque vous avez besoin d'une structure de données simple et immuable que vous pouvez construire étape par étape.
    (par exemple, si vous avez besoin de traiter la liste sur un thread - pour montrer quelques statistiques - et continuer simultanément à construire la liste sur un autre thread au fur et à mesure que vous recevez plus de valeurs, par exemple d'un service réseau).

  • Utilisez List lorsque vous travaillez avec des listes courtes - la liste est la meilleure structure de données à utiliser si la valeur représente souvent une liste vide car il est très efficace dans ce scénario

  • Utilisez Array lorsque vous avez besoin de grandes collections de types de valeurs
    (les tableaux stockent les données dans un bloc de mémoire plat, ils sont donc plus efficaces en termes de mémoire dans ce cas).

  • Utilisez Array lorsque vous avez besoin d'un accès aléatoire ou de plus de performances (et de la proximité du cache).

27voto

Jon Harrop Points 26951

Préférez également seq quand :

  • Vous ne voulez pas garder tous les éléments en mémoire en même temps.

  • Les performances ne sont pas importantes.

  • Vous devez faire quelque chose avant et après l'énumération, par exemple vous connecter à une base de données et fermer la connexion.

  • Vous n'êtes pas en train de concaténer (répété Seq.append fera déborder la pile).

Préférez list quand :

  • Il y a peu d'éléments.

  • Vous allez prépendre et décapiter beaucoup de choses.

Ni l'un ni l'autre seq ni list sont bonnes pour le parallélisme mais cela ne signifie pas nécessairement qu'elles sont mauvaises non plus. Par exemple, vous pouvez utiliser l'un ou l'autre pour représenter un petit groupe d'éléments de travail distincts à effectuer en parallèle.

11voto

pad Points 30450

Juste un petit point : Seq y Array sont meilleures que List pour le parallélisme.

Vous avez plusieurs possibilités : PSeq de F# PowerPack, Array.Parallel et Async.parallèle (calcul asynchrone). La liste est terrible pour l'exécution parallèle en raison de sa nature séquentielle ( head::tail composition).

5voto

Aleš Roubíček Points 2385

Vous devez toujours exposer Seq dans vos API publiques. Utilisez List y Array dans vos implémentations internes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X