Désolé pour le titre mal formulé, mais j'ai posé une question plus tôt à propos d'obtenir une liste unique d'articles de deux listes. Les gens m'ont dit de faire la liste -> ensembles et ensuite union. P>
Alors maintenant, je me demande s'il est plus rapide de: P>
Je devrais probablement simplement lire sur des ensembles dans le recul ... p>
en Python, en passant, désolé de ne pas clarifier. p>
4 Réponses :
La chose la plus rapide que vous puissiez faire est de construire deux ensembles des listes et de prendre le syndicat. Les deux définies de la construction de la liste et de la partie Set sont implémentés dans l'exécution, dans C très optimisé C, il est donc très rapide.
dans le code, si les listes sont édition: comme @ @ Kriss Notes, étendue l1 code> et
l2 code>, vous pouvez faire p>
l1 code> avec
l2 code> est plus rapide. Ce code ne change pas
l1 code> et fonctionne également si
l1 code> et
l2 code> sont génériques itérables. P> p>
Comme vous pouvez le constater en regardant @virhilo Réponse, votre votre n'est pas vrai. Il est plus rapide d'étendre la liste initiale puis de la conversion en défini. Cela a du sens, comme cela est également appelé très optimisé C et étendre des contrôles presque rien et est beaucoup plus simple que de construire un ensemble. Cependant, je ne dis pas que je suppose que votre proposition peut toujours être plus rapide avec certains tests de test (comme des listes contenant de nombreux doublons au début).
J'ai vérifié avec l1 = plage (200) * 100; L2 = plage (150, 250) * 100 code> à l'aide du code @virhilo et la conversion en effet des deux listes en jeux devient légèrement plus rapide que d'abord prolonger la liste initiale ... mais je crois que ce test est un cas extrême.
@kriss: Il est plus rapide s'il y a beaucoup de doublons. Quoi qu'il en soit, je préfère toujours ce code car il n'a pas d'effets secondaires sur la première liste (@ Virhilo's Code) et cela fonctionne également si l1 code> et
l2 code> sont itérables qui ne sont pas
list code> s
Vous pouvez également faire NewList = List (L1); NewList.extend (L2); Renvoyer la nouvelle liste; code> qui fonctionne également sur n'importe quel appareil et ne modifie pas la liste initiale, ni (même plus rapide)
retour (L1) .Union (L2) code> Ce dernier évite une opération ( construire le deuxième ensemble) par rapport à votre version.
Comme vous pouvez le voir à l'extension d'une liste d'une autre extrémité, supprimez les doublons en effectuant un ensemble
est le moyen le plus rapide (au moins en python;))
SET (ITERTOOLS.CHAIN (L1, L2)) CODE> est seulement un peu plus lent et n'a pas besoin de modifier
l1 code>. Aussi plus de mémoire efficace si L1 et L2 sont grandes
faire x = set (l1); x.update (L2) code> est aussi rapide que la méthode
FOO code> (peut-être légèrement plus rapide sur mon ordinateur) et utilise moins de mémoire. Il ne modifie pas non plus
l1 code>.
Ou encore plus rapide (L1) .Union (L2) code> ne modifie rien et aussi efficace de mémoire.
@kriss, avez-vous eu le temps? C'est environ 25% plus ralentissé que d'utiliser la méthode de mise à jour par mon compte. Je suis à peu près sûr que l'utilisation de l'union comme celle-ci est plus lente car elle crée d'abord le jeu (L1) code>, puis crée un autre ensemble (qu'il renvoie) quand il fait l'union.
@Justin Peel: Oui, j'ai fait le temps, mais j'ai eu une faute de frappe dans mon ensemble de test, le vôtre i plus rapide (mais je suis toujours plus lent dans la plupart des cas - trois fois dans ce scénario - que l'extension de la liste initiale).
@kriss, 3 fois plus lent que l'extension de la liste initiale? Pour quelles valeurs de l1 code> et
l2 code>? Je ne vois tout simplement pas les mêmes résultats. En fait, je reçois que la méthode de mise à jour d'ensemble est généralement un peu plus rapide que l'extension. Peut-être que je ne pense pas assez largement dans mes tests.
@Justin Peel: Désolé (encore), je vais mettre un programme de Dunce à la tête un programme avec tout le jour du lundi prochain ... Et aussi je devrais avoir plus de sommeil, mon erreur à nouveau ... vraiment j'en ai vraiment supprimé la conversion à Situé à partir de l'échantillon d'extension de la liste, il ne me demande pas de merveille lors de la synchronisation. C'est un excellent rappel que lorsque les choses sont trop bonnes, je devrais vérifier avant de lui parler ...
@kriss, pas de problème. Nous avons tous cela arrivé parfois. Je faisais juste sûr que ce n'était pas mon tour.
Tout dépend de ce que vous avez comme entrée et souhaitez que la sortie. p>
Si vous avez une liste Mais si vous pouvez travailler avec un ensemble Si au début, vous devez répertorier et que vous souhaitez une liste à la fin, même avec la conversion finale de la liste définie sur la liste, il est plus rapide de gérer l'unicité des éléments à l'aide des ensembles, mais vous pouvez facilement vérifier en regardant l'exemple fourni par l'exemple fourni. par @virhilo dans sa réponse, que concaténant les deux listes à l'aide d'EXTEND, puis la conversion du résultat en direction de l'ensemble est plus rapide que de convertir les deux listes en jeux et effectuant une union. P>
Je ne sais pas exactement quelles sont les contraintes de vos programmes, mais si l'unicité est aussi importante qu'elle semble, et si la commande d'insertion n'est pas nécessaire, vous seriez bien conseillé d'utiliser des ensembles à tout moment, sans jamais changer les listes. La plupart des algorithmes fonctionneront de toute façon, grâce à Duck typing em> car ils sont tous deux différents types d'itérables. P> li code> au début et souhaitez obtenir une liste modifiée à la fin, la méthode plus rapide est
si non elt in li: li.append (elt) Code> Le problème est de convertir la liste initiale en définissant, puis de retour à la liste qui est trop lente. p>
s code> à tout moment (vous ne vous souciez pas de l'ordre de la liste et que les méthodes qui reçoivent cela ont juste besoin de quelque part uéreuse), juste faire
S.Ajouter (ELT) code> est plus rapide. P>
J'aime beaucoup l'approche Virhilo, mais c'est un ensemble assez spécifique de données qu'il testait. Dans tout cela, ne faites pas simplement tester les fonctions, mais faites-les tester comment vous allez le faire. Je mets ensemble un ensemble de tests beaucoup plus exhaustif. Il exécute chaque fonction que vous spécifiez (avec un petit décorateur) via une liste de comparaisons, et des chiffres sur la durée de la longueur de chaque fonction et donc de la quantité de plus lente. Le résultat est que ce n'est pas toujours clair que la fonction que vous devriez faire sans en savoir plus sur la taille, le chevauchement et le type de vos données.
Voici mon programme de test, ci-dessous sera la sortie. P>
Functions Tests extend_list_then_set per_element_append_to_list set_from_one_add_from_two set_from_one_union_two union_sets chain_then_set original, small, some overlap 1 25.04 1.53 1.18 1.39 1.08 no overlap: l1 = [1], l2 = [2..100] 1.08 13.31 2.10 1 1.27 1.07 lots of overlap: l1 = [1], l2 = [1]*100 1.10 1.30 2.43 1 1.25 1.05 50 random ints below 2000 in each 1 7.76 1.35 1.20 1.31 1 50 elements in each, no overlap 1 9.00 1.48 1.13 1.18 1.10 50 elements in each, total overlap 1.08 4.07 1.64 1.04 1.41 1 500 random ints below 500 in each 1.16 68.24 1.75 1 1.28 1.03 500 random ints below 2000 in each 1 102.42 1.64 1.43 1.81 1.20 500 random ints below 200000 in each 1.14 118.96 1.99 1.52 1.98 1 500 elements in each, no overlap 1.01 145.84 1.86 1.25 1.53 1 500 elements in each, total overlap 1 53.10 1.95 1.16 1.57 1.05 10000 random ints below 200000 in each 1 2588.99 1.73 1.35 1.88 1.12 10000 elements in each, no overlap 1 3164.01 1.91 1.26 1.65 1.02 10000 elements in each, total overlap 1 1068.67 1.89 1.26 1.70 1.05 original lists 100 times 1.11 2068.06 2.03 1 1.04 1.17 Average 1.04 629.25 1.82 1.19 1.48 1.06 Standard Deviation 0.05 1040.76 0.26 0.15 0.26 0.05 Max 1.16 3164.01 2.43 1.52 1.98 1.20
+1 pour le bon test de test. Il reste encore quelques implémentations à ajouter au test, comme IChain d'@gnibbler. Il est également douteux que, en temps réel, l'heure de la liste de la liste (L1.Copy ()) doit être comptée ... Dans certains cas, comme l'union de la copie de la copie L1 n'est qu'une perte de temps, et dans tous les cas, la copie de L2 est totalement inutile. (L2 n'a pas été modifié au début), cela pourrait changer «gagnant» ... dans l'ensemble, en sachant davantage sur le cas d'utilisation réel de l'OP serait intéressant d'interpréter les résultats.
J'accepte que l'opération de copie est étrange, mais toutes le font donc de manière à ce que cela soit radié de manière similaire pour tous. Je voulais niveler le champ de jeu de qui modifie l'original L1 et qui n'a pas le plus possible, avec un aspect cohérent. J'ajouterai une chaîne de Gnibbler maintenant.
Dans quelle langue? Avec quelle bibliothèque? Il n'y a pas de réponse à cela dans l'abstrait.
Êtes-vous familiarisé avec le module
TIMINIT code>? Vous pouvez collecter des données et inclure les résultats code> code> dans le cadre de votre question.
Un ensemble est un conteneur, identique à une liste. Vous ne faites pas un élément dans un ensemble, vous effectuez la liste complète dans un ensemble. Vous ne mettez pas les éléments dans l'ensemble à la fois. Vous venez de créer le jeu de la liste.
@Karl Knechtel: Mais pourquoi commence avec une liste au lieu d'un ensemble? Ce serait encore mieux si aucun changement de type de données n'a été nécessaire. Je veux dire jamais b> la conversion est plus rapide que la conversion une fois b>.
@kriss sûr; Mais il est possible qu'il en avait besoin comme une liste ailleurs ...
@Karl Knechtel: OK, mais je suis très curieux de connaître le cas d'utilisation d'une liste où les articles commandent n'est pas important et i> qui ne doit pas avoir de duplicate. L'étape suivante typique serait de le trier avant de l'envoyer à une fonction de sortie et un ensemble est aussi bon qu'une liste pour cela ...
@kriss ... il est possible qu'une autre partie du code avait besoin d'une liste (par exemple pour un accès aléatoire ou une tranchée), et maintenant qu'elle est terminée, un ensemble doit être construit à partir de la liste résultante.
@Karl Navochel: Eh bien, c'est possible i>, toujours curieux du problème réel. Si je comprends bien la question de l'ajout d'articles un par un, je me demande la raison de la question de poser la question de cette façon, ce n'est pas un appel à un processus qui produisent ces articles un par un.