Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme e Aston Martin Aramco F1 Team si sono (ri)unite dando alla vita un flagship con chip Snapdragon 8 Elite Gen 5 e design esclusivo ispirato alle monoposto di Formula 1. La Dream Edition introduce la nuova colorazione Lime Essence abbinata al tradizionale Aston Martin Racing Green, decorazioni intercambiabili personalizzate e una confezione a tema F1, intorno a uno smartphone dall'ottima dotazione tecnica con batteria da 7000mAh ricaricabile a 120W e isola fotografica intercambiabile
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-01-2011, 22:27   #1
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
[python, java] facebook puzzle

da qualche tempo mi sto cimentando con i puzzle di facebook. Al moment sono alle prese con questo: http://www.facebook.com/careers/puzz...p?puzzle_id=17

In soldoni il problema da risolvere è calcolare, data una stringa e una lista di parole valide, quale sia la parola valida più "simile" alla stringa data.

Ho iniziato con una soluzione naive in python, usando l'algoritmo di distanza di Levenshtein e una ricerca completa nello spazio delle parole ammesse.
Ho poi aggiunto un'ottimizzazione basata sugli upper- e lower- bound dell'algoritmo di distanza, in modo da poter filtrare alcune parole della lista senza doverne calcolarne l'effettiva distanza dalla stringa in input.

Dato che la mia implementazione passava tutti i test case proposti nella pagina di discussione relativa al puzzle, ma veniva respinta dal bot di valutazione, ho pensato che il problema fossero le performance.
Ho quindi deciso di provare a implementare la soluzione in Java.

A parità di algoritmo e di test case l'implementazione in Java è drammaticamente più veloce di quella in python (tanto per dare degli ordini di grandezza, con uno specifico test case la versione python termina in 45s, quella in java in 0.8s - sì, quarantacinque contro zero virgola otto!).

Nonostante ciò il bot continua a respingere la soluzione e, confrontando i miei tempi con quelli postati da altri utenti, mi accorgo che ho dei tempi quasi doppi (anche se non viene indicato l'hw usato nei test).

Osservando la lista di parole ammesse, mi accorgo che molte hanno prefissi uguali. Decido quindi di aggiungere una nuova ottimizzazione: mantenere una hashtable di prefissi e dei corrispondenti vettori di distanza dalla stringa in input in modo da velocizzare il calcolo della distanza.

Inserendo questa strategia nella versione python, l'incremento prestazionale è lampante: con lo stesso test case di cui sopra la nuova versione impiega 22s contro i 45 della versione senza ottimizzazione.

Introducendo la stessa strategia nella versione java ho avuto una spiacevole sorpresa: i tempi crescevano (!) in modo drammatico passando da 0.8s a ben 3s!!!

Ho provato a eliminare parti del codice di ottimizzazione per cercare di isolare il responsabile di un tale disastro e ho concluso che il problema è imputabile

- al metodo String.substring (che, per le dimensioni degli input e per il tipo di implementazione, viene chiamato qualche milione di volte), oppure
- alla gestione della hashtable (ma provando a varianre la initial capacity il tempo varia di poco e non sempre si riduce).
Ho letto in varie pagine web che l'uso di substring in java è sconsigliato proprio per motivi di performance.

Che ne pensate?

grazie

Ultima modifica di mad_hhatter : 10-01-2011 alle 01:04.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2011, 01:49   #2
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
per la cronaca, ho inviato una soluzione rimuovendo l'uso della hashtable e aggiungendo invece una semplice ricerca della stringa in input nella lista delle parole ammesse in modo da ottimizzare il caso in cui la stirnga in input sia valida.

Ho notato infatti che senza questo accorgimento la mia soluzione risultava in linea con i tempi degli altri utenti, ma soffriva pesantemente nei casi in cui, appunto, in input ci fosse un'alta incidenza di stringhe valide (caso in cui è molto più conveniente la ricerca all'interno della lista di parole ammesse piuttosto che il calcolo della distanza rispetto a ciascuna parola in lista).

Vediamo se ora passa...
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2011, 09:09   #3
]Rik`[
Senior Member
 
L'Avatar di ]Rik`[
 
Iscritto dal: Mar 2003
Città: Perugia
Messaggi: 16302
substring da quello che ricordo è da evitare come la peste, o almeno così mi sembra di ricordare da una vecchia lezione all'uni..
]Rik`[ è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2011, 14:14   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Se la substring viene utilizzata per confrontare l'inizio della stringa coincide con una data stringa (visto che si parlava di prefissi), sia in Python che in Java si potrebbe utilizzare il metodo startswith (startsWith in Java) allo scopo.

In entrambi i linguaggi il vantaggio è che non viene continuamente allocata e disallocata memoria, tra l'altro.

Comunque da quel che ho capito il bot boccia la soluzione in base al tempo d'esecuzione, ma non c'è messo un tempo preciso? Ho dato una (molto) rapida occhiata, e non ho trovato criteri di bocciatura.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2011, 14:42   #5
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Se la substring viene utilizzata per confrontare l'inizio della stringa coincide con una data stringa (visto che si parlava di prefissi), sia in Python che in Java si potrebbe utilizzare il metodo startswith (startsWith in Java) allo scopo.

In entrambi i linguaggi il vantaggio è che non viene continuamente allocata e disallocata memoria, tra l'altro.

Comunque da quel che ho capito il bot boccia la soluzione in base al tempo d'esecuzione, ma non c'è messo un tempo preciso? Ho dato una (molto) rapida occhiata, e non ho trovato criteri di bocciatura.
purtroppo uso substring per cercare e inserire chiavi in una hashtable quindi non credo di poter usare startswith.

non ci sono parametri espliciti, semplicemente nella mail di risposta il bot dice che ha trovato dei bug che possono essere logici o di performance, ma volutamente non specifica i dettagli (per evitare di essere usato come server di debug).

Tra l'altro la mia ultima soluzione è stata nuovamente respinta... devo controllare di non aver lasciato codice di debug, ma a sto punto non so che altro fare.... vedremo.

In ogni caso mi ha sorpreso
1. la differenza di prestazioni tra l'interprete python e la jvm
2. l'efficienza della gestione dei dizionari e delle stringhe in python rispetto a java
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2011, 16:55   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Se già non l'hai fatto un'occhiatina all'implementazione di substring può rendere l'idea, guarda un po' che combina:
Codice:
public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > count) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    if (beginIndex > endIndex) {
        throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
    }
    return ((beginIndex == 0) && (endIndex == count)) ? this :
             new String(offset + beginIndex, endIndex - beginIndex, value);
}
4 salti condizionati + allocazione di un nuovo oggetto String ad ogni chiamata


Idea, potresti estendere String con una tua classe a cui aggiungi un metodo, tipo:
Codice:
public char[] subchars(int beginIndex, int endIndex) {
        final int start = this.offset + beginIndex;
        final int count = endIndex - beginIndex;
        char[] subchars = new char[count];
        System.arraycopy(this.value, start, subchars, 0, count);
        return subchars;
}
Al max è per verificare se effettivamente così girerebbe più veloce.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 10-01-2011 alle 17:36.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2011, 16:59   #7
]Rik`[
Senior Member
 
L'Avatar di ]Rik`[
 
Iscritto dal: Mar 2003
Città: Perugia
Messaggi: 16302
allora ricordavo bene, è agghiacciante
]Rik`[ è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2011, 17:38   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da ]Rik`[ Guarda i messaggi
allora ricordavo bene, è agghiacciante
No, semplicemente è stata implementata con la massima priorità circa la sicurezza d'uso, e non perchè fosse estremamente prestante.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2011, 07:03   #9
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da mad_hhatter Guarda i messaggi
purtroppo uso substring per cercare e inserire chiavi in una hashtable quindi non credo di poter usare startswith.
Ho capito, ma a questo punto non vedo alternative alla substring per quello che ti serve.
Quote:
non ci sono parametri espliciti, semplicemente nella mail di risposta il bot dice che ha trovato dei bug che possono essere logici
Addirittura. Non è che il bot sia costituito da neuroni reali?
Quote:
o di performance, ma volutamente non specifica i dettagli (per evitare di essere usato come server di debug).
OK, ma almeno un tetto massimo alle prestazioni potevano metterlo.

Anche perché i linguaggi utilizzati sono abbastanza variegati, e differiscono molto a livello prestazionale.
Quote:
Tra l'altro la mia ultima soluzione è stata nuovamente respinta... devo controllare di non aver lasciato codice di debug, ma a sto punto non so che altro fare.... vedremo.
Io gli scriverei e chiederei di conoscere almeno il tetto massimo oltre il quale scatta il timeout per l'applicazione, e le caratteristiche di massima della macchina in cui gira. Almeno eviterei di proporre soluzioni se so già in partenza che verrebbero bocciate causa inefficienza.
Quote:
In ogni caso mi ha sorpreso
1. la differenza di prestazioni tra l'interprete python e la jvm
Purtroppo è concreta: quest'ultima utilizza un compilatore JIT di default, mentre la versione mainstream di Python (e quella usata non è nemmeno delle più recenti; da un pezzo è disponibile la 2.7, che è anche più efficiente) non ne usa al momento.
Quote:
2. l'efficienza della gestione dei dizionari e delle stringhe in python rispetto a java
Perché stringhe e dizionari sono elementi di "prima classe", in quanto alla base di questo linguaggio sia in termini di utilizzo end-user che internamente.

Un consiglio per migliorare le prestazioni: cerca di incapsulare tutto il codice dentro funzioni, e NON accedere a variabili globali, se ti è possibile (al limite passale come parametri durante una chiamata a funzione) ma soltanto se vengono referenziate dentro un loop (se, invece, sono utilizzate "una tantum", per singoli controlli o utilizzi, vanno bene anche globali).

In questo modo tutte le variabili (compresi i parametri passati a una funzione) sono definiti "locali", e il loro accesso (load, store) è di molto più veloce.

Altra cosa: disabilita il garbage collector all'inizio del codice.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2011, 10:26   #10
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da cdimauro Guarda i messaggi
Ho capito, ma a questo punto non vedo alternative alla substring per quello che ti serve.

Addirittura. Non è che il bot sia costituito da neuroni reali?
sicuramente è tutto automatizzato, però ovviamente dovranno evitare script che si inloopano e soprattutto avranno bisogno di processare la coda di soluzioni inviate senza far aspettare giorni per avere una risposta (infatti al max il giorno dopo l'invio il bot risponde).

poi è anche divertente sapere che devi confrontarti non solo con la correttezza logica, ma anche con vincoli prestazionali.

Quote:
OK, ma almeno un tetto massimo alle prestazioni potevano metterlo.

Anche perché i linguaggi utilizzati sono abbastanza variegati, e differiscono molto a livello prestazionale.
sì questo è un po' fastidioso, nel senso che se il vincolo prestazionale fa parte dei requisiti, dovrebbe essere specificato.

E' comunque un buon metodo per capire quale strumento è più adatto a determinati task: finora non avevo mai dovuto confrontarmi più di tanto con l'inadeguatezza di un certo linguaggio nei confronti di un certo problema.

Quote:
Io gli scriverei e chiederei di conoscere almeno il tetto massimo oltre il quale scatta il timeout per l'applicazione, e le caratteristiche di massima della macchina in cui gira. Almeno eviterei di proporre soluzioni se so già in partenza che verrebbero bocciate causa inefficienza.
infatti credo che farò così

Quote:
Purtroppo è concreta: quest'ultima utilizza un compilatore JIT di default, mentre la versione mainstream di Python (e quella usata non è nemmeno delle più recenti; da un pezzo è disponibile la 2.7, che è anche più efficiente) non ne usa al momento.
avevo anche provato a compilare il modulo python per ottenre il corrispondente .pyc, ma le prestazioni sono rimaste invariate

Quote:
Un consiglio per migliorare le prestazioni: cerca di incapsulare tutto il codice dentro funzioni, e NON accedere a variabili globali, se ti è possibile (al limite passale come parametri durante una chiamata a funzione) ma soltanto se vengono referenziate dentro un loop (se, invece, sono utilizzate "una tantum", per singoli controlli o utilizzi, vanno bene anche globali).

In questo modo tutte le variabili (compresi i parametri passati a una funzione) sono definiti "locali", e il loro accesso (load, store) è di molto più veloce.
il codice è già così, ma grazie per il suggerimento!

Quote:
Altra cosa: disabilita il garbage collector all'inizio del codice.
grazie di nuovo!
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2011, 14:05   #11
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Un'altra cosa che mi viene in mente è che potresti preallocare una matrice di una certa dimensione per il calcolo della distanza di Levenshtein, in modo da non allocare e disallocare ogni volta.

Inoltre (ma è tutta da verificare), forse usando array.array (con 'b' o 'i') per allocare le singole "righe" della matrice potresti guadagnare qualcosa. Quindi potresti usare una tupla i cui elementi sono istanze di array.array e accedervi con m[i][j].
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
Piaggio lancia Porter NPE, il pick-up el...
Xiaomi L1 a 153€: il proiettore smart 10...
Dopo Amazon, anche il data center di Gro...
Scoppia il caso Meta AI: l'Europa apre u...
Torna in sconto dopo mesi il super table...
Ricarica elettrica senza cavi: in Svizze...
iPhone SE (2016) entra ufficialmente nel...
The God Slayer: Pathea svela il nuovo op...
Spotify Wrapped 2025: il nuovo Wrapped P...
Offerte OPPO per Natale 2025: i migliori...
ROG Matrix RTX 5090: la GPU gaming pi&ug...
AMD, Cisco e HUMAIN: una joint venture p...
Una bottiglia d'acqua si rovescia nell'a...
Blink Mini quasi regalate: videocamere d...
NASA OSIRIS-REx: trovati ribosio e gluco...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:06.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v