[Python] Réduisons le nombre d'éléments dans le résultat dans le fonctionnement de l'ensemble

Aperçu

Lors de l'exécution d'une opération de consigne, la vitesse d'exécution peut être améliorée en réduisant le nombre d'éléments du résultat obtenu. Le résultat de l'opération étant renvoyé dans un nouvel objet set, la création de l'objet prend du temps si le nombre d'éléments est important.

Contexte

Dans ABC157 D Friend Suggestions, lorsque j'ai défini len (XYZ) pour calculer le nombre d'éléments dans un certain ensemble, il est devenu TLE. AC a été fait avec len (X) -len (X & (Y | Z)) `. J'ai essayé de vérifier pourquoi la vitesse est différente.

|X|Quand est grand

Sur la prémisse du problème|X|,|Y|,|Z| \leq 10^5Mais cette fois je l'ai rencontré|X| \gg |Y|,|Z|Mesurons la condition de.

from timeit import timeit

xyz = 'X=set(range(10**5)); Y=set(range(10)); Z=set(range(5,15))' 

timeit('len(X-Y-Z)', setup=xyz, number=100)
# 0.3884289239649661

timeit('len(X)-len(X&(Y|Z))', setup=xyz, number=100)
# 0.0001103340182453394

Bien que les résultats soient les mêmes, il existe une différence de temps d'exécution de 3520 fois.

Lorsque le contenu de X, Y, Z est le même

Ensuite, soit X, Y, Z tous le même élément de 10 $ ^ 5 $.

from timeit import timeit

xyz = 'X=set(range(10**5)); Y=set(range(10**5)); Z=set(range(10**5))'

timeit('len(X-Y-Z)', setup=xyz, number=100)
# 0.28364974400028586

timeit('len(X)-len(X&(Y|Z))', setup=xyz, number=100)
# 1.1718004010035656

La prochaine foislen(X)-len(X&(Y|Z))Était plus lent.X&(Y|Z)Est le même que l'ensemble d'origine, et on considère que le nombre d'éléments dans le résultat a augmenté. D'autre part, "len (X-Y-Z)" a été raccourci à environ 1/3, probablement parce qu'un ensemble vide a été obtenu au stade de "X-Y".

Ensemble de différences vs ensemble de produits

Simplifiez le problème et comparez uniquement la différence et les opérations du produit. L'autre côté du calcul est un ensemble vide, et les côtés gauche et droit sont échangés.

from timeit import timeit

xy = 'X=set(range(10**5)); Y=set()'

timeit('X-Y', setup=xy, number=100)
# 0.16930873499950394
timeit('Y-X', setup=xy, number=100)
# 1.7047044821083546e-05

timeit('X&Y', setup=xy, number=100)
# 1.0746996849775314e-05
timeit('Y&X', setup=xy, number=100)
# 1.502997474744916e-05

Même dans l'ensemble de différences, il est rapide lorsque le nombre d'éléments dans le résultat est petit. Apparemment, la différence de vitesse n'est pas le contenu du calcul.

Génération d'ensemble

Voir documentation Python set.difference

Renvoie un nouvel ensemble avec des éléments inclus dans l'ensemble et non inclus dans tous les autres.

une. Par conséquent, mesurons le temps de génération d'un ensemble avec un grand nombre d'éléments.

from timeit import timeit

timeit('set(X)', setup='X=set(range(10**5))', number=100)
# 0.16229172004386783

Après tout, lorsque le nombre d'éléments dans le résultat était important, la génération de l'ensemble renvoyé ne prenait que longtemps.

Recommended Posts

[Python] Réduisons le nombre d'éléments dans le résultat dans le fonctionnement de l'ensemble
Obtenir la taille (nombre d'éléments) de Union Find en Python
Obtenez le nombre d'éléments spécifiques dans la liste python
Le résultat de l'installation de python sur Anaconda
Sortie du nombre de cœurs de processeur en Python
Afficher le résultat du traitement de la géométrie en Python
Définir la limite supérieure du nombre de répétitions de fonctions récursives en Python
Utilisons les données ouvertes de "Mamebus" en Python
[Python] Affiche toutes les combinaisons d'éléments de la liste
Mesurons le résultat de l'exécution du programme avec C ++, Java, Python.
Le résultat de l'apprentissage automatique des ingénieurs Java avec Python www
Python --Trouvez le nombre de groupes dans l'expression regex
[Homologie] Comptez le nombre de trous dans les données avec Python
Comptez bien le nombre de caractères thaïlandais et arabes en Python
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
Voyons comment compter le nombre d'éléments dans un tableau dans certains langages [Go, JavaScript, PHP, Python, Ruby, Swift]
Vérifiez le comportement du destroyer en Python
Associez l'ensemble de tables dans les modèles de python.py
Principes de base pour exécuter NoxPlayer en Python
À la recherche du FizzBuzz le plus rapide en Python
Définissez le nom du processus du programme Python
Projet Euler # 17 "Nombre de caractères" en Python
[Python] Combine tous les éléments dans un tableau
[Python3] Comprendre les bases des opérations sur les fichiers
Vérifions la chaîne d'octets en mémoire du nombre flottant flottant en Python
[Python] Calculez le nombre de chiffres requis lors de la saisie de 0 [Note]
Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
[python] Vérifier les éléments de la liste tous, tous
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Analysons le journal de validation git en Python!
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Résultat du calcul après la virgule décimale en Python
Calculez le nombre total de combinaisons avec python
Copiez la liste en Python
Trouvez le nombre de jours dans un mois
Réécrire des éléments dans une boucle de listes (Python)
Découvrez la fraction de la valeur saisie en python
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
Résumé des opérations Excel utilisant OpenPyXL en Python
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Affiche automatiquement les paroles de la chanson en cours de lecture sur iTunes en Python
Divise la chaîne de caractères par le nombre de caractères spécifié. En Ruby et Python.
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
[Python] Précautions lors de la recherche des valeurs maximum et minimum avec un tableau numpy avec un petit nombre d'éléments
Vérifiez si la chaîne est un nombre en python
Opérations sur les fichiers en Python
Découvrez la bonne efficacité de calcul de la vectorisation en Python
[Python] Un programme qui compte le nombre de vallées
Trier en Python. Pensons ensuite à l'algorithme.
Comptez le nombre de paramètres dans le modèle d'apprentissage en profondeur
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?