Problème:La plupart Pythonic façon de recouper deux listes
J'ai une tâche des références croisées un peu compliqué, je dois effectuer entre une liste long
(~ 600.000 entrées) et une liste short
(~ 300.000 entrées). J'essaie de trouver les entrées similaires entre les deux listes, et chaque entrée unique est identifiée par trois entiers différents (appelez-les int1
, int2
, et int3
). Sur la base des trois identifiants d'entiers dans une liste, je veux voir si ces trois mêmes nombres sont dans l'autre liste, et retourner lesquels ils sont.
Tentative:
D'abord, je compressé chaque tuple trois entier dans la liste long
dans un tableau appelé a
. De même, je zippé chaque tuple trois int dans la liste short
dans un tableau appelé b
:
a = [(int1,int2,int3),...] # 600,000 entries
b = [(int1,int2,int3),...] # 300,000 entries
J'itérés chaque entrée a
pour voir si elle était en b
. Si c'était, je les tuples correspondant apposé à un tableau en dehors de la boucle appelée c
:
c= []
for i in range(0,len(a),1):
if a[i] in b:
c.append(a[i])
L'itération est (sans surprise) très lent. Je devine que Python doit vérifier b
pour a[i]
à chaque itération (~ 300 000 fois!), Et son itérer 600 000 fois. Il a pris plus d'une heure maintenant et n'a toujours pas fini, donc je sais que je devrais optimiser quelque chose.
Ma question est la suivante: quel est le moyen le plus rapide ou le plus rapide pour effectuer ce référencement croisé?
Vous seriez peut-être préférable d'utiliser 'filtre()' 'à la place de la carte()' et se débarrasser de 'compress()'. 'x dans a' sera toujours lent; envisagez de convertir 'a' en premier. – mhawke
Tout à fait raison. –