数百万次搜索列表最有效的方法是什么?

时间:2015-02-02 22:29:51

标签: python

我知道搜索的简单方法是有一个包含字符串的列表,只做if string in list,但它变慢了,我听说字典键几乎没有减速大集因为他们没有订购。

但是,我不需要任何与这些项目相关的额外信息,所以制作字典只是为了按住键并将值设置为None感觉有点不对。

我能用什么东西像字典键一样速度快,但就像列表一样?

这是一个简单的例子:

import time, random

totalRange = 100000
searchFor = 5000

#Create a list of 10 million characters
searchableList = []
for i in range( totalRange ):
    searchableList.append( random.randint( 0, totalRange ) )

#Create dictonary with keys set to 'None'
searchableDict = {}
for i in searchableList:
    searchableDict[i] = None

searchableSet = set( searchableList )

#Search list
startTime = time.time()
numberMatches = 0
for number in range( searchFor ):
    if number in searchableList:
        numberMatches += 1
print numberMatches, time.time()-startTime

#Search dictionary keys
startTime = time.time()
numberMatches = 0
for number in range( searchFor ):
    if number in searchableDict:
        numberMatches += 1
print numberMatches, time.time()-startTime

#Search set
startTime = time.time()
numberMatches = 0
for number in range( searchFor ):
    if number in searchableSet:
        numberMatches += 1
print numberMatches, time.time()-startTime

以下是时间输出:

List: 18.8 seconds
Set: 0.002 seconds
Dictionary: 0.0009 seconds

即使设置比列表快很多,字典的速度仍然快两倍,所以我想知道是否还有其他我不知道的事情。使用字典不会太糟糕,我只是想象有一种比dictionary[key]=None更简洁的方法。



根据iCodez的回答进行编辑:

totalRange=1000000searchFor=50000(高出10倍)时进行测试:

List = 20 minutes and still going
Dictionary = 0.023 seconds
Set = 0.02 seconds
Set.intersection = 0.008 seconds

通过更多的计算,似乎集合和字典具有非常相似的效率,但set.intersetion方式显然要好得多。

2 个答案:

答案 0 :(得分:7)

在这种情况下,您应该使用set。集合与字典(constant)具有相同的查找时间,但它们由单个项而不是键/值对组成。因此,您可以获得相同的速度,以减少内存并更好地表示数据。


此外,您可以使用set.intersection代替for-loop:

来提高效率
numberMatches = len(searchableSet.intersection(xrange(searchFor)))

您也会注意到我将range替换为xrange。这使Python无法构建不必要的列表,从而浪费内存。

答案 1 :(得分:4)

使用

a_dict = dict.fromkeys(my_text.split())