[Python] funzione controllo anagrammi

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] funzione controllo anagrammi

Messaggio da gila75 »

Dovremmo aprire un altro 3d comunque...
Per risparmiare spazio con il crivello, si potrebbe operare a livello di bitwise , piu' roba da c che python a dire il vero, ma il risparmio sarebbe notevole.
Credo si possa fare, faro' prove.

Un miliardo di bit ( range primi ) sarebbero " solo" 125 megabyte se non erro
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Python] funzione controllo anagrammi

Messaggio da crap0101 »

come occupazione di memoria di sicuro va meglio, come velocità supponevo di no (e l'ho verificato, dettagli nell'ultima revisione del gist linkato prima). Purtroppo (o per fortuna :-D) alcuni metodi che non certi linguaggi - tipo il C - sono efficienti, non si rivelano altrettanto convenienti applicandoli ad altri.

Conoscere e "saper usare" un linguaggio (o un attrezzo in generale, che sia anche un trapano o una matita) significa anche sapere cosa puoi farci e come, i modi migliori per utilizzarlo (per dire puoi fare anche buchi con una matita in certi materiali, ma forse è meglio il trapano... e scrivere col trapano è ancora più complicato).

Giusto per, riporto qui la versione bitwise, decisamente lenta (ho anche fatto una prova utilizzando bytearray al posto delle liste, ma non dà grandi risultati

Codice: Seleziona tutto

def is_primo__refact5(n):
    if n <= 5:
        return True if n in (2, 3, 5) else False
    elif not n % 2:
        return False
    up = n + 1
    a = 0
    #a |= (1 << 0); a |= (1 << 1) # ignore this
    #for i in range(4, up, 2): a |= (1 << i) # ... and this
    lim = int(math.sqrt(n))
    pivot = 3
    while pivot <= lim:
        for i in range(pivot+1, up):
            if not i % pivot:
                a |= (1 << i)
        pivot += 2
    return not bool((a >> n) & 1)
    
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] funzione controllo anagrammi

Messaggio da gila75 »

Supponevo anche io fosse piu' lenta.
Sul fatto dei linguaggi mi trovo parecchio impanicato, faccio fatica a non fare parallelismi col c, anche se non lo conosco a fondo, sono solo un amatore.
Sta sera vorrei trarre due conclusioni su tutto il 3d.
P.S.: complimenti crap per la tua preparazione, era da un po' che notavo i tuoi post
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Python] funzione controllo anagrammi

Messaggio da crap0101 »

giusto per: https://gist.github.com/crap0101/828f84 ... 527673be93
;-D
gila75 ha scritto:
giovedì 5 maggio 2022, 7:24
Sul fatto dei linguaggi mi trovo parecchio impanicato, faccio fatica a non fare parallelismi col c, anche se non lo conosco a fondo, sono solo un amatore.
eh be, ma è normale... piano piano si riesce a entrare in ottiche "multiple" :-)
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] funzione controllo anagrammi

Messaggio da gila75 »

Volevo fare un po' il punto, la conclusione. Abbiamo divagato parecchio (in modo molto interessante direi) però ora vorrei chiudere per mettere il risolto.
Abbiamo detto che l'ordinamento potrebbe essere superfluo, come pro si scrive in 2 righe.
Il metodo count potrebbe essere più veloce rispetto all'ordinamento in alcuni casi , in altri no.
Diciamo che se a priori sappiamo che le parole molto probabilmente non sono anagrammi, si potrebbe preferire all'ordinamento,
visto che alla prima incongruenza esce. A mio avviso un buon compromesso tra codice semplice e prestazioni.

E' stato proposto il metodo dei dizionari e io come Claudio (mi pare) non mi spiego come non possa essere gravoso.
Crap ha postato l'implementazione sottostante, ma per ora tralascio , visto che probabilmente sarà un po' un casino tra malloc, chiavi di hash, gestione delle collisioni e via dicendo. Interessante ma ai fini dello studio python per ora meglio lasciar perdere.

Il metodo "ibrido" tra dict e set devo ancora guardarlo bene.
Ora, considerato il mio basso livello attuale, senza star li troppo a guardare le prestazioni, che sono state analizzate, per altro cose veramente interessanti,
quale potrebbe essere in definitiva una scelta pythonica per appunto il mio livello ?

Colgo l'occasione per ringraziarvi tutti, sempre spunti interessanti, magari siamo andati un po' OT, ma io non sono rigido e cosa tira cosa :)
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Python] funzione controllo anagrammi

Messaggio da crap0101 »

secondo me, inizialmente, non farti troppi problemi... usando python (o qualsiasi altro strumento), leggendo guide ecc, vedendo e provando codici di altri e scrivendone tu, piano piano comincierai a usarlo nel modo più "consono" ed efficiente. È una cosa graduale e - imho - non bisogna forzarla troppo da subito, applicandosi in genere viene da sè. Per dire, quando mi capita di rileggere degli script miei di dieci anni fa, mi viene da piangere :-D
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] funzione controllo anagrammi

Messaggio da gila75 »

Grazie crap, verissimo quello che dici.
A me purtroppo viene da piangere anche su miei script attuali, ah,ah!! Ma il mio e' un hobby.
Inteteressantissime le divagazioni e i metodi esposti.
Direi che posso concludere. Grazie a tutti :)
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Python] funzione controllo anagrammi

Messaggio da vaeVictis »

Inoltre, algoritmi e linguaggio sono due cose che a un certo punto si dividono.
Credo che uno dei codici più pythonici sia quello che usa Counter del modulo itertools.
E' performante più degli altri? No.
Espone i dettagli dell'algoritmo usato? No.

Gli algoritmi si dovrebbero studiare a prescindere dal linguaggio e ragionando in termini di strutture dati e via dicendo.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] funzione controllo anagrammi

Messaggio da gila75 »

Certo, concordo. Gli algoritmi al di la del linguaggio vanno studiati. Sono tanti e molti non facili. Poi una volta appresi bisogna capire se sono adatti o meno al linguaggio in questione. Mondo vasto, infinito la programmazione. Ma e' il suo fascino
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 8 ospiti