Python recipe(1) : DSU
废话少说,先贴代码:
![div css xhtml xml Example Source Code](https://images.cnblogs.com/cnblogs_com/suyuan/quote.gif)
''' Created on 2010-5-18 @author: lk ''' import operator #simple but inefficient def sort_by_attr1(alist, attr): def sort_by_attr(x,y,attr=attr): return cmp(getattr(x, attr),getattr(y, attr)) return alist.sort(sort_by_attr) #DSU def sort_by_attr2(alist, attr): inter = map(None, map(getattr, alist, (attr,)*len(alist)), xrange(len(alist)), alist) inter.sort() return map(operator.getitem, inter, (-1,)*len(inter)) def sort_by_attr_inplace(alist, attr): alist[:]=sort_by_attr2(alist, attr)
代码来自Python Cookbook 2-7
如代码所示,这是两种“按属性排序”的方法,第一种比较直观,但
1)效率较低,因为decorate和undecorate都是O (N), 算法复杂度主要依赖于sort的O(NlogN), 所以overhead在N较大时可忽略,而DSU避免了向sort传一个回调函数,大大加速了sort部分
2)在Python2.3 之前,不能保证stable
第二种方法即DSU(decorate-sort-undecorate),利用一个附加的序列辅助排序,效率较高,且保证stable
代码细节:
1.xrange函数: 生成一个序列对象,和range不同,range返回一个list对象,而xrange不会直接生成一个list,而是每次访问时返回其中一个值;类似eager和lazy的区别。在序列值很大时xrange做循环显然效率更好
2.map(None, list1,list2,list3)
不知道书上为什么这么使用map……个人认为和zip(list1,list2,list3)没有区别