【问题标题】:Is timsort general-purpose or Python-specific?timsort 是通用的还是 Python 特定的?
【发布时间】:2008-09-30 19:12:46
【问题描述】:

Timsort 是一种自适应的、稳定的、 自然归并。它具有超自然 在多种部分上的表现 有序数组(小于 lg(N!) 需要进行比较,并且尽可能少 N-1),但与 Python 的先前版本一样快 高度调谐的 samplesort 混合 随机数组。

你见过timsort 在 CPython 之外使用吗?有意义吗?

【问题讨论】:

  • 你为什么这么问?如果没有更多上下文,您的问题将无法回答。
  • 你有没有注意到“你见过 timsort 在 CPython 之外使用吗?”部分?
  • 我已经注意到了,但它仍然没有给我们提供任何上下文。你会从一个简单的“不”作为答案中学到什么?
  • 'timsort' 确实非常具体,尽管它对你没有多大意义,除非你真的知道 timsort 是什么。

标签: python algorithm sorting


【解决方案1】:

是的,特别是在 CPython 之外使用 timsort 或在一般情况下使用 Python 是很有意义的。

目前有effort underway用timsort代替Java的“修改归并排序”,初步结果相当正面。

【讨论】:

【解决方案2】:

该算法非常通用,但其好处却是特定于 Python 的。与大多数排序例程不同,Python 的 list.sort(使用 timsort)关心的是避免不必要的比较,因为通常比较比交换项目(总是只是一组指针副本)甚至分配一些额外的内存(因为它始终只是一个指针数组,与任何 Python 操作的平均开销相比,开销很小。)

如果您有类似的限制,那么它可能是合适的。不过,我还没有看到任何其他比较昂贵的案例:-)

【讨论】:

  • 如果比较代价高昂,那么特定于数据的算法通常会比基于比较的算法执行得更好。
  • 这是一个很好的观察结果,并且确实可能​​是您在野外看不到 timsort 或任何接近它的东西的主要原因。
  • 好处是不是 Python特有的。在 Python 中使用 Timsort 对对象引用列表进行排序的相同好处存在于任何具有指针或对象引用的编程语言中。例如,Java SE 7+、Android 和 Swift 使用 Timsort 对对象进行排序。
【解决方案3】:

它看起来并不特别熟悉,但“智能”合并排序在广泛的软件世界中非常普遍。

至于是否有意义,这取决于您要排序的内容,以及比较与内存分配的相对成本。在内存受限的环境中,需要多达 2*N 字节额外内存的排序不是一个好的选择。

【讨论】:

  • 你最后一句是在说 Timsort 吗?它不需要 2*N 字节的额外内存。
  • 来自原始问题中的链接描述:“ + timsort 可能需要一个包含多达 N//2 个指针的临时数组,这意味着在 32 位框中有多达 2*N 个额外字节。”
  • 感谢您的说明。正如您在答案中假设句子​​中的 32 位拱门一样,最好在其中明确提及。
【解决方案4】:

现在在Wikipedia 上回答:timsort 将用于从 Android 复制它的 Java 7。

【讨论】:

    【解决方案5】:

    【讨论】:

      【解决方案6】:

      您链接的描述看起来很笼统。

      【讨论】:

      • 是的,但是你见过 timsort 在 CPython 之外使用吗?
      【解决方案7】:

      Timsort 不是 Python 特有的。在 Python 中使用 Timsort 对对象引用列表进行排序的好处存在于任何具有指针或对象引用的编程语言中。例如,Java SE 7+、Android 和 Swift 使用 Timsort 对对象进行排序。

      另一方面,由于缓存一致性,快速排序的某些变体(例如 introsort、dual-pivot 快速排序)通常会更快地对原始类型进行排序,因此通常选择它来执行此任务。

      【讨论】:

        猜你喜欢
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        • 2019-01-17
        • 2014-02-20
        相关资源
        最近更新 更多