将列表转换为set的快速方法? python 2.7

时间:2016-05-10 06:43:22

标签: python arrays list python-2.7 set

所以在我目前的代码中我使用

im_set=set(map(tuple, im_list[0]))

将列表转换为集合。但它很慢。是否有更快/无地图方法来加快速度?这是我目前的代码

while True:
    cam = cv2.VideoCapture(0)
    start=time.time()
    while(cam.isOpened()):                  #Opens camera
        ret, im = cam.read()                #Takes screenshot
    #im=cv2.imread('RGB.png')
        im=cv2.resize(im,(325,240))         #Resize to make it faster
        im= im.reshape(1,-1,3)
    #im=OneNumber(im)               #Converts the pixels rgb to a singe number
        im_list=im.tolist() 
        im_set=set(map(tuple, im_list[0]))
        ColourCount= set(im_set) & set(om_set)
        print len(ColourCount)

    print N
    end=time.time()-start
    print end

请注意,om_set来自不同的程序。

无论如何,基本上我必须将np.array转换为一个集合,并比较该集合以查看与它们重叠的内容。但是,它很慢。有没有一种方法可以用来加速转换?

2 个答案:

答案 0 :(得分:0)

如果您使用的是Python 3,那将会很快;但是在Python 2中,你应该使用集合理解:

im_set = {tuple(item) for item in im_list[0]}
Python中的

map()速度较慢,因为它返回一个列表。这意味着在您开始创建集合之前,每个元组都存储在内存中。但是,这样,您将每个项目添加到集合中,因为它将转换为元组。

答案 1 :(得分:0)

Using itertools.imap is going to be faster:

In [18]: from itertools import imap

In [19]: timeit set(imap(tuple, l))
100 loops, best of 3: 2.27 ms per loop

In [20]: timeit {tuple(item) for item in l}
100 loops, best of 3: 2.69 ms per loop

You also don't need to create extra sets, you use the ones you have created and use set.intersection:

im_set.intersection(om_set)

Unless you specifically need lists this can also all be done using numpy.