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。

来自为知笔记(Wiz)

时间: 2024-12-18 21:17:47

list 使用 set 方法和fromkeys去重哪个快?的相关文章

HTTP PUT方法和POST方法的区别

POST 方法用来传输实体的主体,PUT方法用来传输文件,自身不带验证机制. 这两个方法看起来都是讲一个资源附加到服务器端的请求,但其实是不一样的.一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源.这个说法本身没有问题,但是并没有从根本上解释了二者的区别.事实上,它们最根本的区别就是:POST方法不是幂等的,而PUT方法则有幂等性.那这又衍生出一个问题,什么是幂等? 幂等(idempotent.idempotence)是一个抽象代数的概念.在计算机中,可以这么理解,一个幂

学习ASP .NET MVC5官方教程总结(七)Edit方法和Edit视图详解

学习ASP .NET MVC5官方教程总结(七)Edit方法和Edit视图详解 在本章中,我们研究生成的Edit方法和视图.但在研究之前,我们先将 release date 弄得好看一点.打开Models\Movie.cs 文件.先添加一个引用: <span style="font-size:14px;">using System.ComponentModel.DataAnnotations;</span> 然后在Movie类中添加以下代码: [Display(

详解equals()方法和hashCode()方法

前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方法,都可以被重写(overwrite). 本文介绍了2种方法在使用和重写时,一些需要注意的问题. 一.equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 通过该实现

【学习笔记】【OC语言】set方法和get方法

1.set方法和get方法的使用场合@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数2.set方法作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值命名规范:方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写形参名称不要跟成员变量同名3.get方法作用:返回对象内部的成员变量命名规范:get方法的名称一般就跟成员变量同名4.成员变量的命名规范成员变量都以下

java——多线程——单例模式的static方法和非static方法是否是线程安全的?

单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static方法不是线程安全的,那么不会因为这个类使用了单例模式,而变的安全. 闲话休说,看代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestSingl

C# 类中隐藏基类方法和Partial

原文:C# 类中隐藏基类方法和Partial 今天对于.NET开发人员来说最开心的事情莫过于微软搞开源了,这觉得是给搞.NET开发的长脸.虽然我是一个初学者,这无疑给我极大的学习动力.Fighting!!! 当一个类从父类继承了一个成员时,也就继承了它的执行代码,如果成员时虚拟的,我们可以用override重写这段执行代码.但无论他是否是虚拟的,都可以通过new 关键字来隐藏它.例如: public class BaseClass { public void DoSomething() { //

java 数组的 toString 方法和 equals 方法以及 java.lang.Object 对象的 toString 方法和 equals 方法

1 public class Test { 2 public static void main(String[] args) { 3 int[] a = {1, 2, 4, 6}; 4 int[] b = a; 5 int[] c = {1, 2, 4, 6}; 6 7 //下面这个方法打印的是a数组的引用地址 8 System.out.println(a.toString()); 9 //下面这个方法比较的是两个数组的引用是否相等 10 System.out.println("a.equals

jQuery.extend()方法和jQuery.fn.extend()方法

jQuery.extend()方法和jQuery.fn.extend()方法源码分析 这两个方法用的是相同的代码,一个用于给jQuery对象或者普通对象合并属性和方法一个是针对jQuery对象的实例,对于基本用法举几个例子: html代码如下: <!doctype html> <html> <head> <title></title> <script src='jquery-1.7.1.js'></script> <

黑马程序员 02-set方法和get方法

———Java培训.Android培训.iOS培训..Net培训.期待与您交流! ——— 1.set方法与get方法的使用场合 @public的成员变量可以被外界随意赋值,往往会产生脏数据,应该使用set方法和get方法来管理成员的访问(类似安检.水龙头过滤,过滤掉不合理的对象),不如人的年龄不可能为负. 2.set方法 (1)作用:给外界提供一个公共的方法用来设置成员变量值,可以在方法里面过滤掉一些不合理的值: (2)命名规范: 1> 方法名必须以set开头 2> set后面跟上成员变量的名