Python的排序

原创 2015年02月17日 00:26:46

Python内置函数sorted可以对可迭代对象进行排序,其中有cmp和key两个参数,这两个参数对排序的效率有很大的影响。

cmp是一个回调函数,原型是:cmp(x, y) ,这与其他语言的sort函数相似,上层自己对元素x和y进行比较,最终返回-1, 0, 1,以此来决定谁在前在后。

key也是一个回调函数,原型是:key(x), 这函数只有一个参数,是可迭代对象的元素,它的意图是通过该函数返回一个可比较的值,然后就不必通过函数来处理,直接比较就行了。因为元素可能是一个对象或其他复杂类型,不可以直接比较。

应该尽可能的使用key来进行排序,它能大大的提高效率,原因是cmp在一次排序中调用的次数很多,每比较两个元素就要调用一次;而key只需要每个元素调用一次;下面用代码来证明:

假设有一个学生类:

class student(object):
	def __init__(self, name, grade, age, score):
		self.name = name
		self.grade = grade
		self.age = age
		self.score = score
我来生成10万个学生:

students = [student(random.choice(('tom', 'colin', 'lily', 'mike', 'red', 'blue')), random.randint(1, 6), random.randint(6, 16), \
random.randint(0, 150)) for i in xrange(100000)]
现在要对这10万个学生进行排序,排序优化级分别是:

1. 年级按小到大排序

2. 分数按小到大排序

3. 年龄按小到大排序

首先我用cmp的方式来排序,并测试排序花费的时间:

def cmp(s1, s2):
	ret = s1.grade - s2.grade
	if ret != 0:
		return ret
	ret = s1.score - s2.score
	if ret != 0:
		return ret
	return s1.age - s2.age

t1 = time.clock()
students = sorted(students, cmp=cmp)
t2 = time.clock()
print 'time = ', t2 - t1
输出的结果是:

time =  0.394109990123

按着我用key的方式来排序,用key的话需要使用一点技巧,将年级,分数,年龄三个结合起来转化成一个数值:

t1 = time.clock()
students =sorted(students, key=lambda s: s.grade * 100000 + s.score*100 + s.age)
t2 = time.clock()
print 'time = ', t2 - t1
输出的结果是:

time =  0.071763113157

效率快了好几倍。

当然这效率仍然不及原生语言,我用Delphi做了测试,速度还要快上3倍,如果Delphi也使用key的方式来优化排序,应该可以更快。

但不管怎么样,对于python来说,尽可能用key来排序总是没错的。

Python 中的列表排序函数

sorted(iterable, cmp=None, key=None, reverse=False)L.sort(cmp=None, key=None, reverse=False)iterable...
  • fireblue1990
  • fireblue1990
  • 2017年02月24日 10:16
  • 400

python 中的排序大法

写在前面的话今天还是技术博客,我怕我控制不住自己,未来的不久又开始写传说中的被蛋蛋狂吐槽的感情博客,先多写几篇技术博客压压惊。今天写Python的排序大法,当然保持以前的作风,又不单单讲排序。1.基本...
  • Grace_0642
  • Grace_0642
  • 2016年11月14日 21:37
  • 2427

用 Python 排序数据的多种方法

用 Python 排序数据的多种方法 目录 【Python HOWTOs系列】排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sor...
  • bestlove12345
  • bestlove12345
  • 2016年07月01日 16:44
  • 5490

python 按中文排序

安装中文库sudo apt-get update sudo apt-get install language-pack-zh-hans-base sudo dpkg-reconfigure local...
  • xiaobuding007
  • xiaobuding007
  • 2017年10月13日 11:33
  • 418543

python中字典不自动排序/删除指定类型文件/执行可执行文件的返回值

1、python 字典的用法 from collections import OrderedDict dict =OrderedDict() dict['foo']=3 dcit['aol']=...
  • listener51
  • listener51
  • 2017年12月15日 19:17
  • 164

【编程语言】Python 列表元组排序

假设我们用一组tuple表示学生名字和成绩:L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)],请用sorted()对上述列表分别按...
  • j790675692
  • j790675692
  • 2016年07月11日 15:34
  • 5967

python 列举文件夹下文件并排序

要列举当前文件夹下的文件,可以用下面的方法: import os a=os.listdir('.\')得到的a是一个列表,里面的元素就是文件夹下每个文件的名字;但是它并不是按我们在文件夹中看到的...
  • cdw_FstLst
  • cdw_FstLst
  • 2015年11月24日 10:30
  • 7564

python list 对时间排序小结。

python list 排序比较简单。但是对时间排序有时可能会比较麻烦一点,对时间的大致思想是对时间字符串进行格式化。然后进行排序。 第一种排序方法是按照https://www.the5fire.c...
  • stan_pcf
  • stan_pcf
  • 2016年07月20日 16:42
  • 2120

Python分组内排序

Code :two_di_list = [[0, 1], [2, 3, 4]]for sub_list in two_di_list: sub_list.sort(reverse=True) ...
  • qq_16912257
  • qq_16912257
  • 2016年12月27日 11:05
  • 1158

Python中对Tuple之间排序时如何指定第几个元素为关键字排序的问题

因为Core Python Programming上的一个作业7-3要求将一个Dictionary的key和value同时显示,并按key排序。 我做完之后就考虑如果要求按value排序呢?或者说多个...
  • thy38
  • thy38
  • 2009年08月03日 19:41
  • 7968
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python的排序
举报原因:
原因补充:

(最多只允许输入30个字)