Je suis curieux de savoir le moyen le plus rapide d'obtenir une liste sans * modifications * de la liste ʻitems* sans ʻitems [i]
, ou une manière raisonnablement rapide et intelligente d'écrire (en excluant parfois le i-ème en mathématiques). , Parce que je veux quelque chose comme ça).
Je l'ai mesuré avec % timeit
de Jupyter.
items = list(range(1000000))
i = 17 #adapté
%timeit items[:i] + items[i+1:]
11.2 ms ± 349 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit [item for k, item in enumerate(items) if k != i]
65.1 ms ± 212 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit [items[k] for k in range(len(items)) if k != i]
75.5 ms ± 800 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Il semble que le tranchage soit extrêmement plus rapide. Au fait, j'ai été un peu surpris que l'utilisation du deuxième «énumérer» soit plus rapide que le troisième exemple.
@ antimon2's Maru Park, mais il existe les méthodes suivantes.
import numpy as np
items = np.arange(1000000)
i = 17
np.hstack
%timeit np.hstack([items[:i], items[i+1:]])
584 µs ± 6.32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
np.delete
%timeit np.delete(items, i)
585 µs ± 3.73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit items[np.arange(items.size) != i]
1.9 ms ± 5.82 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.array([items[k] for k in range(len(items)) if k != i])
182 ms ± 3.85 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Encore une fois, les tranches se combinent très rapidement. Compte tenu de la lisibilité, est-ce que «np.delete» est le meilleur parce que la vitesse ne change pas tellement?
Si vous en avez d'autres, faites-le moi savoir.
Recommended Posts