Python的排序

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来排序总是没错的。

时间: 2024-11-05 23:16:17

Python的排序的相关文章

<转>python字典排序 关于sort()、reversed()、sorted()

一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I'])) #['I', 'have', 'a', 'dream'] 2.让人糊涂的sort()与sorted() 在Python 中sorted是内建函数(BIF),而sort()是列表类型的内建函数list.sort(). sorted() sorted(iterable[,

python 字典排序 关于sort()、reversed()、sorted()

一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I'])) #['I', 'have', 'a', 'dream'] 2.让人糊涂的sort()与sorted() 在Python 中sorted是内建函数(BIF),而sort()是列表类型的内建函数list.sort(). sorted() sorted(iterable[,

python sorted排序

python sorted排序 Python不仅提供了list.sort()方法来实现列表的排序,而且提供了内建sorted()函数来实现对复杂列表的排序以及按照字典的key和value进行排序. sorted函数原型 sorted(data, cmp=None, key=None, reverse=False) #data为数据 #cmp和key均为比较函数 #reverse为排序方向,True为倒序,False为正序 基本用法 对于列表,直接进行排序 >>> sorted([5, 2

python选择排序

def select_sort(list): for i in range(len(list)): position = i for j in range(i,len(list)): if list[position] > list[j]: position = j temp = list[i] list[i] = list[position] list[position] = temp list = [4,4,11,23,4,5,7,9,0,111] select_sort(list) lis

Python实现排序算法之快速排序

Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它小的放到它前面,所有比它大的放到它后面,这个过程称为一趟快速排序 快速排序原理图如下: 实现 #coding=utf-8 #python实现快速排序 def quick_sort(li,start,end): if start < end: flag = li[start] print(flag)

Python字典排序

#!/usr/bin/env python import os import sys import operator def getFile(dir1):     d = os.walk(dir1)     dic = {}     for a,b,c in d:         for i in c:             fn = os.path.join(a,i)             f_size = os.path.getsize(fn)             dic[fn] =

Python实现排序(冒泡、快排、归并)

Thomas H.Cormen 的<算法导论>上介绍的几个经典排序算法的Python实现. 1.冒泡排序: 简单的两重循环遍历,使最小(最大)的值不断地往上升(下沉)而实现的排序,算法时间为O(n2). 代码如下: 1 def up_sort(a): 2 # 冒泡排序 3 4 a_length = len(a) 5 while True: 6 i = 0 7 j = 1 8 9 while True: 10 if a[i] > a[j]: 11 a[i], a[j] = a[j], a[

python 列表排序方法reverse、sort、sorted基础篇

python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse()方法 将列表中元素反转排序,比如下面这样 >>> x = [1,5,2,3,4] >>> x.reverse() >>> x [4, 3, 2, 5, 1] reverse列表反转排序:是把原列表中的元素顺序从左至右的重新存放,而不会对列表中的参数进行排序

python 自定义排序函数

自定义排序函数 Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1.如果 x 和 y 相等,返回 0. 因此,如果我们要实现倒序排序,只需要编写一个reversed_c