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))')
8条答案
按热度按时间mxg2im7a1#
怎么样
编辑:我认为
__contains__
的实现方式与@detly的版本相同kq0g1dla2#
对我来说最明显的是:
6tdlim6h3#
要检查多个值,可以使用numpy.in1d(),这是python关键字in的逐元素函数版本。如果你的数据是排序的,你可以使用numpy.searchsorted():
vxf3dgd44#
迷人.我需要提高一系列循环的速度,这些循环必须以同样的方式执行匹配索引确定。所以我决定把所有的解决方案都放在这里,沿着一些即兴表演。
以下是我对Python 2.7.10的速度测试:
18.86137104034424
15.061666011810303
11.613027095794678
7.670552015304565
5.610057830810547
1.6632978916168213
0.0548710823059082
0.054754018783569336
太令人惊讶了!数量级的差距!
总结一下,如果你只是想知道某个东西是否在1D列表中:
如果你也想知道某个东西在列表中的位置(顺序很重要):
8wigbo565#
在1d中添加@HYRY的答案似乎是numpy最快的。这是使用numpy 1.8和python 2.7.6。
在这个测试中,in 1d是最快的,但是
10 in a
看起来更干净:构造一个集合比调用in 1d慢,但检查值是否存在要快一点:
ncgqoxb06#
我认为最方便的方法是:
其中瓦尔是要检查的值,X是数组。在你的例子中,假设你想检查值8是否存在于第三列中。简单地写
如果第三列中有8,则返回True,否则返回False。
mm9b1k5b7#
如果你正在寻找一个整数列表,你可以使用索引来完成这项工作。这也适用于nd-arrays,但似乎更慢。这样做可能会更好,不止一次。
通过使用numba和njit,我可以得到大约x10的加速。
igetnqfo8#
我建议使用np.isin。
本指南建议使用此函数来屏蔽值,但您可以直接在这些掩码上调用
any
或all
来检查成员资格。我建议按照上面的建议使用timeit
检查速度。不要 * 使用for循环,这首先就击败了使用numpy的想法。
请注意,我已经将其扩展到任意维数组,但您始终可以使用自己的
a
切片来查看列内部,等等。您可以通过将数组放在第一位来检查列表中的任何成员是否在数组中,或者将数组放在第二位来检查它是否包含列表的所有成员。
结果如下: