Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.lang.python > #7581

Re: Trovare gli indici degli elementi che corrispondono a un criterio in una lista

From Riccardo Lemmi <riccardo@reflab.com>
Newsgroups it.comp.lang.python
Subject Re: Trovare gli indici degli elementi che corrispondono a un criterio in una lista
Followup-To it.comp.lang.python
Date 2015-06-30 11:48 +0200
Organization Reflab
Message-ID <mmtol3$qu0$1@speranza.aioe.org> (permalink)
References <mms9sb$gd7$1@speranza.aioe.org>

Followups directed to: it.comp.lang.python

Show all headers | View raw


Paolo Ferraresi wrote:

> Ciao Ragazzi,
> sto imparando Python e devo dire che mi la sintassi pulita che ha però
> mi domando... so che i cicli for sono piuttosto lenti, quindi, se io
> ho una lista che contiene un gran numero di elementi...
> Se uso filter ottengo una lista con gli elementi che soddisfano un
> certo criterio, se uso index ottengo la prima occorrenza, ma se
> volessi ottenere una lista con gli indici degli oggetti che soddisfano
> un certo criterio, come dovrei fare?
> Io l'ho fatto così...
> 
> def find(f,lst):
>      return [i for i, x in enumerate(lst) if f(x)==True]
> 
> ad esempio se ho una lista di boolean e cerco gli indici i per cui
> v[i]==True, farei...
> 
> lista_indici = find(lambda x: x, v)
> 
> Ma la mia domanda sorge spontanea... così come esistono algoritmi
> superveloci perché in puro "C" (es numpy, la mia lista potrebbe essere
> anche un array di numpy) c'è qualche libreria che fa questo o comunque
> il modo che ho fatto è il modo più corretto ed efficiente per Python.
> Ragazzi chiedo a voi, dato che io sono alle prime armi con Python.
> 
> Ciao e grazie.

Uno dei mantra del python è:

  "Make it work, make it right, make it fast"

quindi l'ottimizzazione in un programma complesso rimane solo l'ultima 
fase.

Nel caso specifico non credo esista un "modo" pythonico per fare 
l'operazione "velocemente". 

L'unica cosa che mi sento di consigliare se la lista è molto grande è 
quella di usare un generatore (o iteratore). La velocità rimane quella 
ma l'occupazione di memoria diventa minima, chiaramente tutto l'array 
deve essere "generato" un elemento alla volta (anche se letto da 
qualche sorgente esterna). 

Il motivo è semplice se hai un array salvato in qualche sistema esterno 
la velocità di esecuzione del programma è di solito inferiore rispetto 
al tempo di accesso al disco o della connessione di rete, cioè al 
caricamento dell'array in memoria.

Nella situazione opposta in cui la velocità di estrazione dei dati è 
sensibilmente inferiore al tempo di esecuzione di f() probabilmente 
andrebbe ripensata tutta l'architettura per sfruttare il parallelismo 
di un multi-core (code, processi etc).

Insomma non è un argomento tanto semplice da affrontare :D

Pensa a scrivere dei programmi che si "capiscano" e lascia 
l'ottimizzazione solo come ultimo passo e solo se necessario.

-- 
                                       Riccardo Lemmi

Back to it.comp.lang.python | Previous | NextPrevious in thread | Find similar


Thread

Trovare gli indici degli elementi che corrispondono a un criterio in una lista Paolo Ferraresi <fp.box@alice.it> - 2015-06-29 22:30 +0200
  Re: Trovare gli indici degli elementi che corrispondono a un criterio in una lista Claudio_F <clau.fin@tin.it> - 2015-06-29 23:00 +0200
  Re: Trovare gli indici degli elementi che corrispondono a un criterio in una lista Riccardo Lemmi <riccardo@reflab.com> - 2015-06-30 11:48 +0200

csiph-web