Faszinierend. Ich musste die Geschwindigkeit einer Reihe von Schleifen verbessern, die auf dieselbe Weise eine Matching-Index-Bestimmung durchführen müssen. Also habe ich beschlossen, alle Lösungen hier zusammen mit einigen Riffs zu planen.
Hier sind meine Geschwindigkeitstests für Python 2.7.10:
import timeit
timeit.timeit('N.any(N.in1d(sids, val))', setup = 'import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])')
18.86137104034424
timeit.timeit('val in sids', setup = 'import numpy as N; val = 20010401020091; sids = [20010401010101+x for x in range(1000)]')
15.061666011810303
timeit.timeit('N.in1d(sids, val)', setup = 'import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])')
11.613027095794678
timeit.timeit('N.any(val == sids)', setup = 'import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])')
7.670552015304565
timeit.timeit('val in sids', setup = 'import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])')
5.610057830810547
timeit.timeit('val == sids', setup = 'import numpy as N; val = 20010401020091; sids = N.array([20010401010101+x for x in range(1000)])')
1.6632978916168213
timeit.timeit('val in sids', setup = 'import numpy as N; val = 20010401020091; sids = set([20010401010101+x for x in range(1000)])')
0,0548710823059082
timeit.timeit('val in sids', setup = 'import numpy as N; val = 20010401020091; sids = dict(zip([20010401010101+x for x in range(1000)],[True,]*1000))')
0,054754018783569336
Sehr überraschend! Größenordnungsunterschiede!
Zusammenfassend lässt sich sagen, ob Sie nur wissen möchten, ob sich etwas in einer 1D-Liste befindet oder nicht:
- 19s N.any (N.in1d (Numpy Array))
- 15s x in (Liste)
- 8s N.any (x == numpy Array)
- 6s x in (numpy Array)
- .1s x in (Set oder ein Wörterbuch)
Wenn Sie auch wissen möchten, wo sich etwas in der Liste befindet (Reihenfolge ist wichtig):
- 12s N.in1d (x, numpy Array)
- 2s x == (numpy Array)