Sto cercando una infrastruttura dati per gestire il ciclo di un gran numero di subroutine ordinate, alcune delle quali sono attive, molte delle quali non lo sono.
Penso che ho bisogno di un'implementazione di un python set come oggetto che rimane ordinato quando modificato, può essere facilmente iterato (non mi interessa se funziona un loop effettivo, purché esista un modo semplice ed efficiente leggere ogni elemento in ordine). E soprattutto può essere modificato mentre viene iterato.
Questo per consentire un'implementazione di una forma molto specifica di programma di subroutine (sfortunatamente non posso usare i moduli di subroutine incorporati dato che il mio programma python sta emulando il comportamento di un sistema legacy proprio così ho bisogno di un controllo più fine.)
Effettivamente ho un elenco di subroutine a cui fa riferimento un numero di indice in un dizionario, le subroutine sono ripetute in ordine ascendente fino a quando non viene raggiunto l'ultimo punto in cui ritorniamo al numero più basso. Tuttavia ci sono un gran numero di subroutine e solo poche in qualsiasi momento saranno 'attive' e quelle che non sono attive vengono saltate nell'ordine per l'esecuzione. Ho considerato semplicemente di dare a ciascuna routine una bandiera attiva che sarebbe stata testata prima di essere eseguita, tuttavia l'enorme numero di routine potenziali rispetto al numero minuscolo di quelle attive rende questo metodo molto lento. Le subroutine vengono attivate o disattivate solo occasionalmente ma eseguendole devono essere molto veloci. Come tale ho cercato di mantenere una lista delle chiavi di quelle attive e scorrere quella, aggiungendole o rimuovendole quando sono attivate o disattivate, ma sto cercando un modo ragionevolmente efficiente di mantenere questo elenco.
I due principali sistemi che mi sembrano fattibili sono blist ordinati set , tuttavia non sono sicuro che supportino modificato mentre è iterato sopra e usando due heapq e spostando gli articoli tra loro in ordine, questo sicuramente supporterà modifica in qualsiasi momento, ma richiederebbe molto più lavoro manuale e probabilmente sarebbe più lento.
Tuttavia, qualcuno potrebbe avere una risposta molto migliore di una di queste, quindi apprezzerò qualsiasi idea su come ottenere ciò con ragionevole efficienza e idealmente in un modo "pitonico", sebbene possa essere un po 'brutto se fa il lavoro.