我知道一个简单的搜索方法是使用包含字符串的列表,然后只需执行
然而,我不需要与项目相关的任何其他信息,所以仅仅为了保存键并将值设置为
有没有一种像字典键一样速度快,但像列表一样的东西可以使用?
以下是一个快速的示例:
以下是时间输出:
尽管集合比列表快得多,但字典仍然快了一倍,所以我想知道是否还有其他我不知道的东西。使用字典也不会太糟糕,我只是想象有比
基于iCodez的答案进行编辑:
当
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=1000000
和searchFor=50000
(高10倍)时的测试结果:List = 20 minutes and still going
Dictionary = 0.023 seconds
Set = 0.02 seconds
Set.intersection = 0.008 seconds
更多计算后,似乎集合和字典的效率非常相似,但是使用 set.intersection
的方法明显更好。
set.intersection
应该会更快。 - DSM