令人着迷。我需要提高必须以相同方式执行匹配索引确定的一系列循环的速度。所以我决定在这里计算所有解决方案的时间,以及一些即兴演奏。
这是我对 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
非常令人惊讶!数量级差异!
总而言之,如果您只想知道某物是否在一维列表中:
- 19s N.any(N.in1d(numpy array))
- 15s x in (list)
- 8s N.any(x == numpy 数组)
- 6s x in(numpy 数组)
- .1s x in(集合或字典)
如果您还想知道列表中的某些内容(顺序很重要):
- 12s N.in1d(x, numpy 数组)
- 2s x ==(numpy 数组)