在Python中对对象进行排序

时间:2010-04-30 10:16:21

标签: python sorting

我想通过其中一个属性对对象进行排序。截至目前,我正在以下列方式做到这一点

USpeople.sort(key=lambda person: person.utility[chosenCar],reverse=True)

这很好用,但我已经读过使用operator.attrgetter()可能是实现这种排序的更快方法。首先,这是正确的吗?假设它是正确的,我如何使用operator.attrgetter()来实现这种排序?

我试过了,

 keyFunc=operator.attrgetter('utility[chosenCar]')
 USpeople.sort(key=keyFunc,reverse=True)

但是,我收到错误消息,说没有属性'utility [chosenCar]'。

问题是我想要排序的属性是在字典中。例如,实用程序属性采用以下形式:

utility={chosenCar:25000,anotherCar:24000,yetAnotherCar:24500}

我想使用operator.attrgetter()通过selectedCar的实用程序进行排序。我怎么能这样做?

提前致谢。

3 个答案:

答案 0 :(得分:2)

不,attrgetter不会比lambda快 - 它实际上只是做同样事情的另一种方式。

您可能会因使用key代替cmp的建议而感到困惑,这确实要快得多,但您已经这样做了。

答案 1 :(得分:1)

访问您必须使用的chosenCar项:

>>> P.utility={'chosenCar':25000,'anotherCar':24000,'yetAnotherCar':24500}
>>> operator.itemgetter('chosenCar')(operator.attrgetter('utility')(P))
25000

对于key函数,您必须执行以下操作:

>>> def keyfunc(P):
    util = operator.attrgetter('utility')(P)
    return operator.itemgetter('chosenCar')(util)

>>> USpeople.sort(key=keyfunc,reverse=True)

然而,你的主要主张是这种方法的更好表现似乎研究不足。我建议使用timeit模块来测试自己数据的两种方法的性能。

答案 2 :(得分:1)

  • 永远不会根据您已阅读的内容进行优化。进入你的代码并随意改变你认为应该更快的东西并不是一个有效的优化策略。

  • 如果您想改进代码,请按以下步骤进行优化。

    1. 别。这通常是浪费时间。
    2. 制作一个可以运行,可测试的程序。
    3. 确定效果指标 - 能够回答“此代码是否足够快?”
    4. 意识到您的代码已经足够快了。
    5. 如果您无法执行步骤(4),请对代码进行分析以获得实际输入,以确定其花费时间的位置。在Python中,您可以使用http://docs.python.org/library/profile.html来执行此操作。 瓶颈发生在意想不到的地方,这将告诉您实际需要付出的努力。
    6. 检查算法次优的耗时代码。这有时会发生在您所处的水平,但通常也会出现几个等级。改进算法几乎总是加速的最大机会。
    7. 如果您无法改进算法,请测试基于相同内容的各种代码,并查看它们的执行方式。使用http://docs.python.org/library/timeit.html来测试代码段(这比人们意识到的要难,所以要小心)并重新运行性能测试和配置文件。

      尝试先做这个步骤可能很诱人,但这往往证明是无用的。您需要知道您正在优化的内容是有道理的。

    8. 我希望这可以提供一些有关如何加速代码(以及何时不打扰)的见解。我见过很多人尝试用经验法则优化来替换随机代码,但我还没有看到那些人生成优秀,快速的软件。优化必须科学地进行,使用理论(例如6中的计算机科学)和实验(例如7中的时间)。

    9. 在这种特殊情况下,我敢打赌,SilentGhost的代码最终比你的慢。我当然不确定,但除非你计时,否则你也不知道。

      (我认为你不应该打扰时机,我认为你应该采用最清晰的方法,原来的方法。)