2015-12-22 11 views
5

Supponiamo, sto costruendo un dizionario probabilmente grande in Python 3 per le operazioni in memoria. Le chiavi del dizionario sono numeri interi, ma ho intenzione di leggerli da un file come stringa all'inizio.Trade-off in tipi di chiavi del dizionario Python

Per quanto riguarda la memorizzazione e il recupero, mi chiedo se è importante memorizzare le chiavi del dizionario come numeri interi o come stringhe.
In altre parole, lasciandoli come numeri interi aiuta con l'hashing?

+0

Quale sarebbe il vantaggio dall'archiviazione dei valori come stringa anziché int se rappresentano numero intero? Questa sarebbe la cosa migliore da fare se vuoi avere un codice complicato come 'my_dict [str (my_val)]' ovunque. Se questi sono numeri interi, usa 'int', indipendentemente dal modo in cui memorizzi le informazioni nei tuoi file. – Holt

+1

Utilizza numeri interi se li utilizzi come numeri successivi in ​​un secondo momento, usa le stringhe se li usi come stringhe più tardi. – poke

+0

La risposta di @poke è la più accurata – Ramast

risposta

1

realtà l'hashing stringa è piuttosto efficiente in Python 3. I expected questo è il risultato opposto:

>>> timeit('d["1"];d["4"]', setup='d = {"1": 1, "4": 4}') 
0.05167865302064456 
>>> timeit('d[1];d[4]', setup='d = {1: 1, 4: 4}') 
0.06110116100171581 
3

Dicts sono veloci ma possono essere pesanti sulla memoria. Normalmente non dovrebbe essere un problema, ma lo saprai solo quando testerai. Vorrei consigliare di testare per la prima volta 1.000 linee, 10.000 linee e così via e dare un'occhiata all'impronta di memoria.

Se si esaurisce la memoria e la struttura dei dati lo consente, provare a utilizzare named tuples.

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') 
import csv 
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): 
    print(emp.name, emp.title) 

(esempio tratto dal link)

Se avete ascendente interi si potrebbe anche cercare di ottenere più fantasia utilizzando la array module.

1

Sembra che tu non abbia infastidito il benchmarking delle alternative. Risulta che la differenza è piuttosto leggera e trovo anche differenze incoerenti. Inoltre questo è un dettaglio di implementazione su come è implementato, poiché sia ​​gli interi che le stringhe sono immutabili potrebbero essere confrontati come puntatori.

Quello che dovresti considerare è quale sia la scelta naturale della chiave. Ad esempio, se non si interpreta la chiave come numero altrove, non c'è motivo di convertirla in un numero intero.

Inoltre, è necessario considerare se si desidera considerare le chiavi uguali se il loro valore numerico è uguale o se devono essere identicamente lessicali. Ad esempio, se si considerasse lola stessa chiave di 0, sarà necessario interpretarlo come numero intero e quindi l'intero è la chiave corretta, se invece si desidera considerarli diversi, sarebbe assolutamente sbagliato convertirli in numeri interi (come sarebbero diventati gli stessi allora).

Problemi correlati