• 比 O(nlog(n)) 做得更好 — 5.结束语和基准


    这就是 groupSort 真正优于 mergeSort 的地方。

    长按关注《Python学研大本营》,加入读者群,分享更多精彩 扫码关注《Python学研大本营》,加入读者群,分享更多精彩

    最后的想法

    我们知道,将一个大问题分解为一系列更小、更简单的问题是一种基本的编程范式。通过检查这些关于排序的想法,可以看出,有时,我们也可以从将我们的问题变成一个完全不同的问题中受益。通过这样做,我们也许能够使用真正提高效率和速度的工具和方法——我们在原始环境中无法使用的工具和方法。

    这种方法在大数据环境中似乎具有非凡的价值。在这些环境中,我可能有数以百万计的数据点,如果不是数以百万计的数以百计,甚至数十亿的数据点,其范围将相对较小。从下面的基准中可以看出,这就是 groupSort 真正开始明显优于 mergeSort 的地方。

    基准

    使用的 Python 版本:3.9.7

    处理器:AMD Ryzen 5 3600 6 核处理器 3.60 GHz

    内存:16.0 GB

    显卡:NVIDIA GeForce RTX 2060 Super

    原版 Python groupSort 与 C 实现的 timSort

    首先,让我真正说明一下我的观点。我将用普通 Python 编写的方法与 Python 的 sorted() 函数进行比较,根据 Wikipedia的说法,该函数是 mergeSort 和 insertSort 的组合,并使用 C 实现。我运行了 100 次迭代的测试,生成了一个随机数组每次100万个元素和10万个范围(不包括在时间统计中)。结果如下:

    Timsort,即Python的sorted()函数:

    基本组排序:

    Vanilla Python 阈值比较

    groupSort 与 timSort(~rng 5000 万,大小 100 万)

    groupSort 与 quickSort(~rng 2500 万,大小 100 万)

    groupSort vs. countSort(组总是~2x 快)

    groupSort 与 bucketSort(~rng 380 万,大小 100 万)

    与 mergeSort 的详细比较

    现在,关于普通 Python 中的 groupSort 与普通 Python 中的 mergeSort 的基准比较。

    在前面的部分中,所有代码示例都是单次运行。在这里,我将提供这些场景在多次迭代中平均时的屏幕截图。

    包含 100 万个元素的数组,具有1亿个范围,100 次迭代

    使用基本组排序:

    使用数字桶分组排序:

    使用合并排序:

    100 万个元素的数组,1000万个范围,100 次迭代

    使用基本组排序:

    使用数字桶分组排序:

    使用合并排序:

    100 万个元素的数组, 100万个范围,100 次迭代

    使用基本组排序:

    使用数字桶分组排序:

    使用合并排序:

    100 万个元素的数组, 10 万个范围,100 次迭代

    使用基本组排序:

    使用数字桶分组排序:

    使用合并排序:

    100 万个元素的数组,10000个范围,100 次迭代

    使用基本组排序:

    使用数字桶分组排序:

    使用合并排序:

    100 万个元素的数组,1000个范围,100 次迭代

    使用基本组排序:

    使用数字桶分组排序:

    使用合并排序:

    (完结)

    https://medium.com/@ajchristian86/doing-better-than-o-nlog-n-part-5-68895553fb99

    推荐书单

    《Pandas1.x实例精解》

    本书详细阐述了与Pandas相关的基本解决方案,主要包括Pandas基础,DataFrame基本操作,创建和保留DataFrame,开始数据分析,探索性数据分析,选择数据子集,过滤行,对齐索引,分组以进行聚合、过滤和转换,将数据重组为规整形式,组合Pandas对象,时间序列分析,使用Matplotlib、Pandas和Seaborn进行可视化,调试和测试等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

    链接:https://u.jd.com/UKjx4et

    精彩回顾

    《Pandas1.x实例精解》新书抢先看!

    【第1篇】利用Pandas操作DataFrame的列与行

    【第2篇】Pandas如何对DataFrame排序和统计

    【第3篇】Pandas如何使用DataFrame方法链

    【第4篇】Pandas如何比较缺失值以及转置方向?

    【第5篇】DataFrame如何玩转多样性数据

    【第6篇】如何进行探索性数据分析?

    【第7篇】使用Pandas处理分类数据

    【第8篇】使用Pandas处理连续数据

    【第9篇】使用Pandas比较连续值和连续列

    【第10篇】如何比较分类值以及使用Pandas分析库

    长按关注《Python学研大本营》

    长按二维码,加入Python读者群

    扫码关注《Python学研大本营》,加入读者群,分享更多精彩

  • 相关阅读:
    使用es6语法set对数组去重
    Spring:Bean生命周期
    Codeforces Round #826 (Div. 3) D E F
    kafka 生产者 API 实践总结
    基于Springboot2.0的Dubbo入门项目(dubbo-spring-boot-starter)
    css 图片好玩的一个属性,添加滤镜
    Effective C++ 规则31:将文件间的编译依存关系降至最低
    JavaSE阶段常见面试题(二)
    电阻的分类介绍
    Java零基础入门看着一篇就够了
  • 原文地址:https://blog.csdn.net/weixin_39915649/article/details/127946955