J'ai essayé d'appliquer un algorithme pour réduire une liste python en une plus petite basée sur un certain critère. En raison du grand volume de la liste initiale, dans l'ordre de 100k éléments, j'ai essayé de itertools pour éviter les allocations de mémoire multiples, donc je suis venu avec ceci:itertools.islice par rapport à la liste slice
reducedVec = [ 'F' if sum(1 for x in islice(vec, i, i+ratio) if x == 'F')
> ratio/3.0 else 'T'
for i in xrange(0, len(vec), ratio) ]
Temps d'exécution pour cela prend inquiétant longtemps l'ordre de quelques minutes, quand vec a environ 100k éléments. Quand j'ai essayé à la place:
reducedVec = [ 'F' if sum(1 for x in vec[i:i+ratio] if x == 'F')
> ratio/3.0 else 'T'
for i in xrange(0, len(vec), ratio) ]
En substance remplacer l'islice avec une tranche l'exécution est instantanée. Pouvez-vous penser à une explication plausible pour cela?
J'aurais pensé qu'éviter d'allouer à plusieurs reprises une nouvelle liste avec un nombre substantiel d'éléments me sauverait quelques cycles de calcul au lieu de paralyser toute l'exécution.
Cheers, Themis
Qu'en est-il en utilisant '' vec.count ("F", i, i + rapport) '' au lieu de '' sum (1 pour x dans vec [i: i + ratio] si x == 'F') ''? Le rend plus lisible à mon avis et probablement plus rapide, aussi. –