你应该使用元组,它可以被哈希:
mydict = {}
mydict[(1, 2)] = 'xxx'
mydict[1,2] = 'xxx'
如果这实际上太慢了(不要进行不必要的优化),那么就给定一个整数的最大值,构建一个索引:
def index(a, b, maxB):
return a*maxB + b
mydict[index(1, 2, max)] = 'xxx'
但要注意,函数调用可能会进一步减慢速度,因此您可以将函数内联以换取可读性,并使其更容易在其他地方复制粘贴时引入错误:
mydict[1*max + 2] = 'xxx'
顺便提一下,在 Stack Overflow 上有一个关于使用元组作为字典键的读取速度的问题:
Python tuples as keys slow?
进行了一点点的分析表明,内联索引比元组稍微快一些(<5%),两者都比索引快两倍。如果在 PyPy 中执行此操作,我希望索引版本(无论是内联还是非内联)会更快。
此外,如果您担心将数据插入到字典中的速度,那么您可能正在使用错误的数据结构,或者可能正在做太多不必要的工作。例如,将 CSV 文件解析为每行字段中的值,并以这种方式将值存储在字典中 data[line,field]
,如果您可以使行解析变为惰性的,并只解析您实际提取数据的行。也就是说,当你可以使用 dataLines = somecsv.readlines(); print getField(dataLines[7], 'date')
时,就不要使用 data = parseAll(somecsv); print data[7,'date']
。
mydict[(x,y)]
)是最快的。如果你先构建一个列表,然后再将其转换为元组(这是不必要的),它需要大约1.7倍的时间(mydict[tuple([x,y])]
)。字符串方法最慢,慢2.6倍。如果元组已经存在,你可以使它更快,mydict[some_tuple]
比mydict[(x,y)]
快0.7倍。 - Lauritz V. Thaulowdict
,然后计时了一个for循环迭代这些元组(for x,y in ...
),使用各种方法将其插入到字典中。我对所有键使用None
作为插入值。 - Lauritz V. Thaulow