繁体   English   中英

有没有更快的方法来检查值是否在python中的集合中?

[英]Is there a faster way to check if a value is in a set in python?

我想维护一个字符串列表,并继续检查它们在列表中的不同变量。

我在做的是:

li=[one,two,three]
for x in different_x_values:
  if(x in li):
    print 'yes'

有没有比x in li中使用x in li更快的方法来检查某些字符串是否在某些其他字符串集合中?

检查更新的python版本中的内置“set()”数据类型 - 我认为它应该比列表更快。 字典键曾经是快速的方式,但我认为现在设置相同或更快,所以如果你正在使用2.5之前版本的python你可能会做以下事情(无论什么值在dict是):

li = {'one':1, 'two': 1, 'three':1}
for x in different_values:
    if x in li:
        print 'yes'

更新的版本,只需使li成为set()。

为此使用set对象。

Python2> s = set(["one", "two", "three"])
Python2> "one" in s
True

Python2> s2 = set(["three", "four", "five"])

路口:

Python2> s & s2
set(['three'])

Python2> x = "three"
Python2> x in s & s2
True

我想这就是你想要的,两套的交集。 如果您了解设置对象,我认为意图更具可读性。

print set(different_values).intersection(li)

应该工作相同......可能会更快..

>>> other_values = ["franks","pies","pie","beans"]
>>> li = ["apple","pie","franks","and","beans"]
>>> set(other_values).intersection(li)
set(['franks', 'beans', 'pie'])

这里有一些基准

In [1]: other_values = range(1000)
In [2]: li = range(500,1000)
In [3]: %timeit set(other_values).intersection(li)
10000 loops, best of 3: 78.6 us per loop
In [4]: %timeit [x for x in other_values if x in li]
100 loops, best of 3: 8.7 ms per loop
In [5]: %timeit set(other_values) & set(li)
10000 loops, best of 3: 97.6 us per loop

所以看起来设置交叉点要快得多

我相信你已经得到了答案,这是为了完整起见。 出于好奇,我对所提到的方法进行了测试,得到了以下结果。

大小=主列表的大小
setopttime:使用s1和s2的那个
setintersectiontime:使用交叉操作的那个
bruteforcetime:burte force time

大小= 1000
setoptime:0:00:00.001000
setintersectiontime:0:00:00.001000
bruteforcetime:0:00:00.005000

大小= 10000
setoptime:0:00:00.001000
setintersectiontime:0:00:00.010000
bruteforcetime:0:00:00.367000

大小= 100000
setoptime:0:00:00.001000
setintersectiontime:0:00:00.115000
bruteforcetime:0:00:35.444000

方法1(setopttime)获胜。 如果要检查,这是代码。

import timeit
import datetime
def getList(size):
    s=[]
    for i in range(size):
        s.append(str(i))
    return s

def getSubList(size):
    s=[]
    for i in range(size/2):
        s.append(str(i))
    return s

def testSet(size):
    s=set(getList(size))
    sublist=set(getSubList(size))
    list(s&sublist)


def testIntersection(size):
    s=set(getList(size))
    sublist=set(getSubList(size))
    list(s.intersection(sublist))

def bruteForce(size):
    s=getList(size)
    sublist=getSubList(size)
    final=[]
    for elem in sublist:
        try:
            if s.index(elem)!=-1:
                final.append(elem)
        except ValueError:
            pass
currentsize=1000
for i in range(3):
    t1=datetime.datetime.now()
    testSet(1000)
    t2=datetime.datetime.now()
    testIntersection(currentsize)
    t3=datetime.datetime.now()
    bruteForce(currentsize)
    t4=datetime.datetime.now()
    print "Size="+str(currentsize)
    print "setoptime:"+str(t2-t1)
    print "setintersectiontime:"+str(t3-t2)
    print "bruteforcetime:"+str(t4-t3)
    currentsize=currentsize*10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM