list 使用 set 方法和fromkeys去重哪个快?

set介绍

Python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.

set去重

可以简单的使用l = list(set(l)) 去重,

测试代码

  1. #coding:utf-8
  2. #coding:utf-8
  3. l =[1,2,3,4,4,5,6,6]
  4. s =set(l)
  5. print s
  6. l = list(s)
  7. print l

测试结果

  1. set([1,2,3,4,5,6])
  2. [1,2,3,4,5,6]

fromkeys去重性能更好?

fromkeys用法:dict.fromkeys(seq[, value])),value默认是None
说明:创建并返回一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值(默认为None)
{}.fromkeys(l).keys(),直接按照l内容,生成一个key为l中值,v为Notes的词典,然后取key的集合。 可以直接对l去重,且性能更好

测试代码

  1. #coding:utf-8
  2. l =[1,2,3,4,4,5,6,6]
  3. l2 ={}.fromkeys(l).keys()
  4. print l2

测试结果

  1. [1,2,3,4,5,6]

性能测试

通过列表生成式创建2千万个对象,每个对象出现两次的list,然后进行去重

set方式测试代码

  1. #coding:utf-8
  2. import time
  3. l1 =[ x for x in range(10000000)]
  4. l2 =[ x for x in range(10000000)]
  5. for x in l2:
  6. l1.append(x)
  7. print'start'
  8. start = time.clock()
  9. s =set(l1)
  10. l = list(s)
  11. end= time.clock()
  12. print'end'
  13. print("耗时: %.03f seconds"%(end-start))
  14. print len(l)

set方式运行结果

  1. start
  2. end
  3. 耗时:0.990 seconds
  4. 10000000

fromkeys方式测试代码

  1. #coding:utf-8
  2. import time
  3. l1 =[ x for x in range(10000000)]
  4. l2 =[ x for x in range(10000000)]
  5. for x in l2:
  6. l1.append(x)
  7. print'start'
  8. start = time.clock()
  9. l2 ={}.fromkeys(l1).keys()
  10. end= time.clock()
  11. print'end'
  12. print("耗时: %.03f seconds"%(end-start))
  13. print len(l2)

fromkeys运行结果

  1. start
  2. end
  3. 耗时:1.246 seconds
  4. 10000000

验证结果反而是set方式更快,难道是数据特殊性导致?

调整为1000万个数字出现20次,共2亿数据去重
set耗时:

  1. 200000000
  2. start
  3. end
  4. 耗时:10.679 seconds
  5. 10000000
  6. 200000000
  7. start
  8. end
  9. 耗时:8.654 seconds
  10. 10000000

fromkeys耗时:

  1. 200000000
  2. start
  3. end
  4. 耗时:9.293 seconds
  5. 10000000
  6. 200000000
  7. start
  8. end
  9. 耗时:9.255 seconds
  10. 10000000

结论

耗时差不多,随便用。。有时候甚至set更快,想IB用fromkeys。





posted on 2016-09-28 01:28  assd2001  阅读(1635)  评论(0编辑  收藏  举报

导航