Ho trovato un metodo che è anche più veloce di DSM, prendendo ispirazione da Eric, anche se il miglioramento si vede meglio con elenchi di valori più piccoli; a valori molto grandi, il costo dell'iterazione stessa supera il vantaggio dell'esecuzione del test di verità durante la creazione dell'array numpy piuttosto che dopo. Test con entrambi is
e ==
(per le situazioni in cui le stringhe sono internate rispetto a quando potrebbero non esserlo, come is
non funzionerebbe con stringhe non internate. Come 'True'
probabilmente sarà un letterale nello script che dovrebbe essere internato, sebbene) ha dimostrato che mentre la mia versione con ==
era più lenta rispetto a is
, era ancora molto più veloce della versione di DSM. configurazione
prova:
import timeit
def timer(statement, count):
return timeit.repeat(statement, "from random import choice;import numpy as np;x = [choice(['True', 'False']) for i in range(%i)]" % count)
>>> stateIs = "y = np.fromiter((e is 'True' for e in x), bool)"
>>> stateEq = "y = np.fromiter((e == 'True' for e in x), bool)"
>>> stateDSM = "y = np.array(x) == 'True'"
Con 1000 voci, le dichiarazioni più veloci prendere circa il 66% del tempo del DSM di:
>>> timer(stateIs, 1000)
[101.77722641656146, 100.74985342340369, 101.47228618107965]
>>> timer(stateEq, 1000)
[112.26464996250706, 112.50754567379681, 112.76057346127709]
>>> timer(stateDSM, 1000)
[155.67689949529995, 155.96820504501557, 158.32394669279802]
Per gli array di stringhe più piccoli (nell'ordine delle centinaia piuttosto che migliaia), il tempo trascorso è inferiore al 50% del DSM di:
>>> timer(stateIs, 100)
[11.947757485669172, 11.927990253608186, 12.057855628259858]
>>> timer(stateEq, 100)
[13.064947253943501, 13.161545451986967, 13.30599035623618]
>>> timer(stateDSM, 100)
[31.270060799078237, 30.941749748808434, 31.253922641324607]
Un po 'oltre il 25% del DSM di quando fatto con 50 articoli per lista:
>>> timer(stateIs, 50)
[6.856538342483873, 6.741083326021908, 6.708402786859551]
>>> timer(stateEq, 50)
[7.346079345032194, 7.312723444475523, 7.309259899921017]
>>> timer(stateDSM, 50)
[24.154247576229864, 24.173593700599667, 23.946403452288905]
Per 5 voci, circa l'11% del DSM di:
>>> timer(stateIs, 5)
[1.8826215278058953, 1.850232652068371, 1.8559381315990322]
>>> timer(stateEq, 5)
[1.9252821868467436, 1.894011299061276, 1.894306935199893]
>>> timer(stateDSM, 5)
[18.060974208809057, 17.916322392367874, 17.8379771602049]
Si tratta di un array di stringhe NumPy (se esiste una cosa del genere) o un array di stringhe Python? – Eric
È una serie di stringhe numpy - strano, lo so. – Newmu
@Newmu - Penso che la soluzione a questo è evitare di ottenere un array di rappresentazioni di stringhe in primo luogo. Come sei arrivato da quell'array? Forse è qui che dovremmo iniziare a cercare di ottimizzare questo ... – mgilson