Python recipe(1) : DSU

废话少说,先贴代码:

div css xhtml xml Example Source Code Example Source Code [http://www.cnblogs.com/tomsheep/]
'''
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)没有区别

posted on 2010-05-20 18:24  tomsheep  阅读(802)  评论(0编辑  收藏  举报

导航