python - 为什么 DSU decorate-sort-undecorate 比提供比较函数更快?

标签 python sorting

Python 爱好者喜欢谈论一种称为 DSU 的技术:

假设我想按第三个字段的 int 值对列表进行排序:

# Decorate
decorated = [(int(item[2]), item) for item in items]
# Sort
decorated.sort()
# Undecorate
items = [item[1] for item in decorated]

据推测,这种方法比:

def compare(item1, item2):
    return cmp(int(item1[2]), int(item2[2]))
items.sort(compare)

为什么 DSU 更快?是什么让没有比较器的 sort() 变得特别?

最佳答案

这取决于从项目到排序依据的值的转换成本。在这种情况下,转换是取第三项的int

使用比较方法,每个项目会发生多次转换。使用 decorate/sort/undecorate 方法,每个项目只发生一次转换。如果键函数开销很大,那么每个项目只调用一次应该更有效。

请注意,您可以使用内置函数执行装饰/排序/取消装饰方法:

items.sort(key=lambda item: int(item[2]))

关于python - 为什么 DSU decorate-sort-undecorate 比提供比较函数更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32186877/

相关文章:

javascript - 未捕获的类型错误 : Object (JS Function) has no method 'apply'

python - Keras,级联多个 RNN 模型用于 N 维输出

python - 如何在 Keras 中向 CuDNNGRU 或 CuDNNLSTM 添加循环丢失

php - 搜索时高级 ORDER BY

java - 仅根据字段名称对类数组进行排序

python - 重写discord.py |我的命令出错

python,从影子中获取加密的用户密码

ruby-on-rails-3 - 使用 rails_admin 对字段进行排序

c++ - 使用数组查找 HCF,得到未知输出 (C++)

python - 使用包含字典值的元素对列表进行排序