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

Path csiph.com!aioe.org!.POSTED!not-for-mail
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 Tue, 30 Jun 2015 11:48:19 +0200
Organization Reflab
Lines 61
Message-ID <mmtol3$qu0$1@speranza.aioe.org> (permalink)
References <mms9sb$gd7$1@speranza.aioe.org>
NNTP-Posting-Host NKuVJmg4CazSZgy+nbcNYQ.user.speranza.aioe.org
Mime-Version 1.0
Content-Type text/plain; charset="UTF-8"
Content-Transfer-Encoding 8Bit
X-Complaints-To abuse@aioe.org
User-Agent KNode/4.4.8
X-Notice Filtered by postfilter v. 0.8.2
Xref aioe.org it.comp.lang.python:7581

Followups directed to: it.comp.lang.python

Show key headers only | 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