这就是我对“装饰-排序-去除装饰(decorate-sort-undecorate,DSU)”的看法。假定您拥有这样的数据集:
"Jane Jones" -> 15,000
"Dan Smith" -> 6,000
"Kim Black" -> 40,000
假定您需要按照他们的相关收入对人名进行排序。一个简单的方法可能是使用库入口点来进行排序,所提供的比较函数指出:“Kim Black”位于“Dan Smith”之前,因为 40000 大于 6000,等等。对于小问题而言,这既简单又有效。
但是,为了更加有效 - 特别是每次对一百万项进行排序时,这在生物科学、金融和其它一些领域很常见 - 就要专门创建专用的“反向表”。尽管这项操作很耗时,但是它使排序变得非常快速。Python 的列表理解(list comprehension)使得这表达起来特别简洁;但是这一原则同样也适用于您手头可以使用的任何语言:
清单 3. 用 Python 编写的最小的装饰-排序-去除装饰例子
decorated = [ (revenues[name], name) for name in name_list ]
decorated.sort()
for (revenue, name) in decorated:
print "%14s: %8d" % (name, revenue)
对派生的数据集进行排序可以轻松地使整个操作加速一个或几个数量级。对于学生来说,计算“计算复杂度”似乎是较难的课题之一;但是当这些方法产生这样的加速时,它们的价值无庸置疑。
快了 500 倍
就在去年,独立顾问 Alex Martelli 取得了一次更惊人的突破。就象他在 Python 业务论坛(Python Business Forum)邮件列表中所叙述的那样他已经实现了一个 XML 处理器,该处理器完成其任务需要 8 小时。这是无法接受的;最终用户不可能等这么久。他结合多次修正,结果使时间降到了一分钟,是他一开始所用时间的五百分之一。
因此,第二个简单原则是:添加更多的内存,并更好地利用您所拥有的内存。许多人,包括经理,似乎比较喜欢添加内存。