前期在python程序开发中用了很多set,
提供了丰富的‘&,|,-’等操作,使用非常方便,方便鬼方便,对于服务器性能还是非常重要的。于是
对SET的速度做了些测试,非常的快(我的测试方法是插入100W条数据,然后插入100W零1,set特性肯定会在这100w数据中查找,如果遍历查找是吃不消的,测试结果非常快)。
于是看了python 2.5中set部分的实现,貌似是使用hashtable做底层的数据结构。
于是写python代码做了测试,如下:
import random
l = []
m = {}
i = 0
while 1:
v = random.randint(1,10000)
l.append(v)
m[v] = 1
i += 1
if i >= 100:
break
s = set(l)
print 's:', s, '\n'
print 'm:', m.keys(), '\n'
执行后打印结果:
s: set([5888, 8712, 1553, 3092, 7706, 9247, 4640, 9761, 7721, 560, 8244, 1598, 1091, 4677, 9295, 7773, 7776, 1126, 3175, 1131, 3184, 9842, 2679, 7293, 639, 4230, 4231, 5571, 6810, 3227, 158, 2720, 6319, 3256, 2746, 7357, 4291, 2244, 7884, 7373, 6350, 8399, 1744, 2769, 9946, 2268, 7912, 9452, 7413, 247, 4053, 8448, 8982, 5915, 8476, 6439, 4908, 4402, 4405, 825, 314, 4417, 2893, 2895, 8020, 7005, 8039, 2922, 2417, 7028, 2422, 9591, 8573, 8576, 5953, 8771, 5827, 9649, 6071, 3523, 1992, 1487, 1488, 7125, 9174, 6618, 3035, 5596, 4064, 7137, 7650, 1509, 9710, 7153, 1010, 4596, 7157, 2040, 4092])
m: [5888, 8712, 1553, 3092, 7706, 9247, 4640, 9761, 7721, 560, 8244, 1598, 1091, 4677, 9295, 7773, 7776, 1126, 3175, 1131, 3184, 9842, 2679, 7293, 639, 4230, 4231, 5571, 6810, 3227, 158, 2720, 6319, 3256, 2746, 7357, 4291, 2244, 7884, 7373, 6350, 8399, 1744, 2769, 9946, 2268, 7912, 9452, 7413, 247, 4053, 8448, 8982, 5915, 8476, 6439, 4908, 4402, 4405, 825, 314, 4417, 2893, 2895, 8020, 7005, 8039, 2922, 2417, 7028, 2422, 9591, 8573, 8576, 5953, 8771, 5827, 9649, 6071, 3523, 1992, 1487, 1488, 7125, 9174, 6618, 3035, 5596, 4064, 7137, 7650, 1509, 9710, 7153, 1010, 4596, 7157, 2040, 4092]
居然完全一样,确认了之前的想法,set底层实现和dict底层实现相似,都用了hashtable。set,map都有相同的特性,集合中元素唯一。