Sto tentando di ottimizzare e capire perché per l'input n una funzione che ho scritto f (n) sembra non terminare mai l'esecuzione quando n > 26.
TL; DR Ho bisogno di capire come trovare la complessità delle varie istruzioni Python che implicano la concatenazione di una stringa vuota e ricerche nel dizionario tutte all'interno di un ciclo while. Il resto appare come O (1) o trascurabile. Leggi di seguito per provare che ho RTFM ampiamente e ho bisogno di aiuto per afferrare questo
f (n) restituisce una stringa alfabetica casuale di lunghezza n:
def func(n, prefix=None):
if prefix is None:
empty = ""
else:
empty = prefix
while (len(empty) < n):
c = padder[random.randint(0,len(padder) -1)]
if empty.find(c) == -1:
str = empty+c
empty = str
return empty
Disassembro il bytecode Python
>>>dis.dis(func(8))
0 BREAK_LOOP
1 POP_BLOCK
2 PRINT_NEWLINE
3 INPLACE_POWER
4 RETURN_VALUE
5 PRINT_ITEM
6 <69>
7 IMPORT_STAR
Tuttavia, quando n > 26 si blocca. Perché il seguente è più veloce? (nota: sostituisci x con la lunghezza desiderata della stringa)
print(''.join(random.choice(string.ascii_uppercase) for i in range(x)))
Quando lo disassembro come sopra, sembra eseguito in O (n).
Finora, sono giunto alla conclusione che dovrei abbattere ogni operazione, trovare le loro complessità e questo determinerebbe il motivo per cui si blocca su n > 26. Ho trovato un cheatsheet per la complessità temporale delle comuni operazioni python
Tuttavia, non copre SETUP_LOOP, LOAD_CONST vs LOAD_FAST, ecc. e altre istruzioni python
Qualcuno può spiegare perché il mio primo script è più lento del secondo e almeno mi indica un buon materiale di riferimento? I google dork'd
intext:"python" intext:"time complexity" intext:"instruction"
Che era chiaro su un cheatsheet. Ho trovato una buona spiegazione ma è stato un po 'difficile da seguire