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))')
7 回答
迷人 . 我需要提高一系列循环的速度,这些循环必须以同样的方式执行匹配的索引确定 . 所以我决定在这里解决所有的解决方案,以及一些riff .
以下是我对Python 2.7.10的速度测试:
18.86137104034424
15.061666011810303
11.613027095794678
7.670552015304565
5.610057830810547
1.6632978916168213
0.0548710823059082
0.054754018783569336
非常令人惊讶!数量级差异的订单!
总而言之,如果您只是想知道某个列表中是否存在某些内容:
19s N.any(N.in1d(numpy array))
15s x in(列表)
8s N.any(x == numpy数组)
6s x in(numpy数组)
.1s x in(set或字典)
如果你想知道列表中的某些内容(顺序很重要):
12s N.in1d(x,numpy数组)
2s x ==(numpy数组)
要检查多个值,可以使用numpy.in1d(),这是python关键字的元素功能版本 . 如果您的数据已排序,则可以使用numpy.searchsorted():
根据我的最方便的方式是:
其中Val是您要检查的值,X是数组 . 在您的示例中,假设您要检查第三列中是否存在值8 . 简单写一下
如果第三列中有8,则返回True,否则返回False .
添加到@ HYRY的答案in1d似乎是最快的numpy . 这是使用numpy 1.8和python 2.7.6 .
在这个测试中,in1d最快:
使用Python集似乎是最快的:
如果要检查列表
a
是否在numpy数组b
中,请使用以下语法:把
axis = 1
考虑为numpy数组的形状n*2
对我来说最明显的是:
怎么样
编辑:我认为
__contains__
的实现方式与@ detly的版本相同