我知道搜索的简单方法是有一个包含字符串的列表,只做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.intersetion
方式显然要好得多。
答案 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())