Come, quando e perché gli sviluppatori utilizzano strutture dati personalizzate in python?

6

La mancanza di puntatori di Python rende la costruzione della struttura dei dati intuitivamente più impegnativa e ha così tante funzionalità incorporate che, da amatore, non riesco a vedere quando, perché o come si creerebbe qualcosa oltre ciò che è già presente.

Quando hai costruito il tuo e perché lo hai fatto? Per esempio. tipi speciali di alberi, ecc.

    
posta temporary_user_name 11.12.2012 - 20:25
fonte

2 risposte

3

Beh, quel tipo di dipende da ciò che sei disposto a chiamare una "struttura dati". Secondo Wikipdia, una struttura dati è semplicemente un "modo particolare di archiviare e organizzare i dati in un computer in modo che possa essere utilizzato in modo efficiente". Pertanto, le classi sarebbero una forma di struttura dei dati e le classi sono ampiamente utilizzate in Python. Ma, per il gusto di questa risposta, assumerò che tu sia più interessato a ciò che potresti conoscere in una classe di strutture e algoritmi di dati (ad esempio alberi, liste collegate, code, hash, ecc ...).

Ora, grazie alla sintassi simile a pseudo-codice di Python, può essere un linguaggio molto utile per l'implementazione delle strutture di dati. Se non altro per aiutare semplicemente a comprendere questi concetti di base. Ad esempio, quando ho appreso per la prima volta della lista collegata ho deciso di implementarli in Python:

class node:
    def __init__(self, data = None, is_header = False):
        self.data = data
        self.next = None
    def __str__(self):
        return "|{0}| --> {1}".format(str(self.data), str(self.next))


class linked_list:
    def __init__(self):
        self.header = node("!Header!", True)

    def add_node(self, add_me):
        current_node = self.header
        while 1:
            if current_node.next == None:
            current_node.next = add_me
            break
            else:
            current_node = current_node.next    

    def print(self):
        print (str(self.header))

Ora, questo non è un esempio perfetto, né è nemmeno un'implementazione completamente corretta di una lista collegata, ma va ad illustrare qualcosa:

La semplice sintassi di Python può essere utile per comprendere le strutture di dati

Un altro esempio potrebbe essere una coda di priorità che ho ricostruito nel corso della giornata:

class priority_queue:
    def __init__(self):
        self.element = []
        self.priority = []

    def enqueue_with_priority(self, me, priority):
        where = 0
        for i in range(len(self.element)):
            if not priority < self.priority[i]:
            where = i
            break

        self.element.insert(where, me)
        self.priority.insert(where, priority)

    def dequeue_highest(self):
        return self.element.pop(0)

    def print(self):
        for i in self.element:
            print i

Ancora una volta, non un'implementazione perfetta ma illustra un altro vantaggio della codifica di una struttura dati in Python:

Python è utile nella prototipazione delle strutture di dati per ottimizzarle per linguaggi di programmazione di livello inferiore

Guardando indietro a questo codice vedo difetti nella mia implementazione. Il codice Python, tuttavia, tende ad essere breve e dolce. Quindi, se volessi implementare una struttura di dati in un linguaggio di livello inferiore (come un linguaggio in stile c) potrei prima generare un prototipo Python veloce e poi ottimizzare in seguito.

Infine, penso che Python possa aiutare nello sviluppo di strutture dati, perché:

In Python, lo sviluppo è veloce, gli errori sono consentiti e puoi provare le cose.

Immagina di costruire una struttura dati simile a una tabella hash, in un linguaggio compilato con strong tipizzazione, in cui di solito dovresti provare qualcosa in un IDE, quindi devi compilarlo ed eseguirlo. In Python, puoi semplicemente estrarre IDLE, iPython o l'interprete Python e provare solo le cose! Non è necessario ricompilare ogni piccola modifica alla funzione di hash che vuoi provare, basta collegarlo all'interprete.

Quindi, in conclusione, immagino che quello che sto dicendo sia che sono d'accordo con te: non c'è molta praticità nella costruzione delle tue strutture dati (dato che la maggior parte di ciò che vuoi è già stato implementato e ottimizzato). Tuttavia, per me, c'è un sacco di benefici educativi (grazie alla facilità di sintassi di Python), così come un sacco di libertà creativa e di sviluppo (a causa del basso-vincolo di Python, EAFP design).

È importante notare che sebbene python (attraverso la sua libreria ad ampio raggio) fornisca molte strutture dati standard, una "struttura dati" (per definizione) può essere praticamente qualsiasi cosa. Quindi, in Python come in ogni altro linguaggio che possiamo usare per risolvere problemi non banali, avremo bisogno di definire nuove strutture di dati. Pertanto, è abbastanza discutibile che i seri sviluppatori Python creano strutture dati personalizzate proprio come fanno gli sviluppatori seri in altri linguaggi.

    
risposta data 11.12.2012 - 20:56
fonte
2

Per creare strutture dati in Python devi usare una classe. I riferimenti in Python (e altri linguaggi basati su riferimenti) agiscono come puntatori e quindi non vi è alcuna restrizione alla possibilità di implementare una struttura dati.

Python ha molte strutture dati integrate. Ma così fanno anche altre lingue. Vedi STL per C ++ o la libreria standard di Java. Anche in C ++ e Java raramente è necessario implementare la propria struttura dati perché la maggior parte delle strutture di base esiste già.

Ma a volte, c'è una struttura dati di cui hai bisogno che Python non ha incorporato. Ad esempio, python non ha alcuna struttura incorporata basata sugli alberi, o elenchi concatenati, ecc. Non hai bisogno di tutto questo spesso, ma quando ne hai bisogno, ne hai bisogno.

    
risposta data 11.12.2012 - 20:53
fonte

Leggi altre domande sui tag