• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 序列的sort方法与bisectinsort,heapqheappush效率比较

序列的sort方法与bisectinsort,heapqheappush效率比较

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了arrays.sort方法,java中sort方法,sort方法,java sort方法,js中的sort方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:序列的sort方法 与 bisectinsort, heapqheappush 效率比较
描述:

import time
import bisect,heapq,random

def sort1(n):
    "sort1 : bisect"
    lst = []
    for i in xrange(n):
        bisect.insort_left(lst,random.randint(1,10000))
    return lst

def sort2(n):
    "sort2 :lst.sort"
    lst = []
    for i in xrange(n):
        lst.append(random.randint(1,10000))
    lst.sort()
    return lst

def sort3(n):
    "sort3 : heapq"
    lst = []
    for i in xrange(n):
        heapq.heappush(lst,random.randint(1,10000))
    return lst

for i in [sort1,sort2,sort3]:
    time1 = time.clock()
    i(100000)
    time2 = time.clock()
    time_all = time2-time1
    print i.__doc__,time_all

输出结果:

sort1 : bisect 2.49
sort2 :lst.sort 0.36
sort3 : heapq 0.42

为什么 bisect, heapq 反而比内置方法 sort 还要慢?


解决方案1:

1. bisect

根据insort_left 的文档:

Keep in mind that the O(log n) search is dominated by the slow O(n) insertion step.

也就是说,单次 insort_left 的时间复杂度是 O(n),自然 sort1 的复杂度就变成了 O(n^2),它最慢是应当的。

2. sort

文档说是 O(n log n) 的复杂度。从 listsort 详细文档来看,开发人员着实没少下了工夫。

3. heappush

根据维基百科,插入操作的时间复杂度是 O(log n),所以总的时间复杂度仍然是 O(n log n)。不过有一点值得注意,插入操作的平均时间是 O(1),所以有可能会稍微快一点。

Python vs. PyPy

CPython 2.7

sort1 : bisect 2.617674
sort2 :lst.sort 0.295187
sort3 : heapq 0.39279

PyPy 2.4

sort1 : bisect 1.31
sort2 :lst.sort 0.043
sort3 : heapq 0.029

注,我把你的调用部分复制了一遍,执行了两次,结果为第二次的输出。

可以看得出,O(n log n) 算法的耗时是在同一个数量级上的,但 CPython 中 sort 胜出,PyPy 中 heapq 胜出。

cProfile

用 cProfile 来测试,先看一下 CPython 的结果:

CPython lst.sort:

         400007 function calls in 0.935 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   100000    0.325    0.000    0.386    0.000 random.py:175(randrange)
        1    0.211    0.211    0.933    0.933 t.py:11(sort2)
   100000    0.203    0.000    0.590    0.000 random.py:238(randint)
   100000    0.071    0.000    0.071    0.000 {method 'append' of 'list' objects}
        1    0.062    0.062    0.062    0.062 {method 'sort' of 'list' objects}
   100000    0.061    0.000    0.061    0.000 {method 'random' of '_random.Random' objects}

CPython heapq:

         400006 function calls in 1.091 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   100000    0.348    0.000    0.439    0.000 random.py:175(randrange)
        1    0.228    0.228    1.089    1.089 t.py:19(sort3)
   100000    0.212    0.000    0.651    0.000 random.py:238(randint)
   100000    0.210    0.000    0.210    0.000 {_heapq.heappush}
   100000    0.091    0.000    0.091    0.000 {method 'random' of '_random.Random' objects}

可以看出,相同操作消耗的时间差不太多,不同的地方在于 sort 用了 62ms、append 用了 71ms,总共是 133ms;而相比之下,heappush 用了 210ms。再根据之前 PyPy 的迹象,这里怀疑 CPython 和 heapq 的 C 实现在多次互相调用中有一些解释器相关的“额外”代码。

最后再看一下 PyPy 的情况。

PyPy lst.sort:

         400007 function calls in 0.071 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.025    0.025    0.071    0.071 t.py:11(sort2)
        1    0.018    0.018    0.018    0.018 {method 'sort' of 'list' objects}
   100000    0.011    0.000    0.019    0.000 random.py:172(randrange)
   100000    0.008    0.000    0.008    0.000 {method 'random' of 'Random' objects}
   100000    0.006    0.000    0.006    0.000 {method 'append' of 'list' objects}
   100000    0.005    0.000    0.023    0.000 random.py:235(randint)

PyPy heapq:

         1156196 function calls in 0.171 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.047    0.047    0.171    0.171 t.py:19(sort3)
   100000    0.034    0.000    0.070    0.000 heapq.py:242(_siftdown)
   228095    0.031    0.000    0.036    0.000 heapq.py:135(cmp_lt)
   100000    0.013    0.000    0.013    0.000 {method 'append' of 'list' objects}
   100000    0.012    0.000    0.098    0.000 heapq.py:140(heappush)
   100000    0.011    0.000    0.017    0.000 random.py:172(randrange)
   100000    0.009    0.000    0.026    0.000 random.py:235(randint)
   100000    0.006    0.000    0.006    0.000 {method 'random' of 'Random' objects}
   228095    0.005    0.000    0.005    0.000 {hasattr}
   100000    0.002    0.000    0.002    0.000 {len}

情况发生了变化!PyPy 的 heapq 实现是纯 Python 的,依托 PyPy 的性能来达到飞一般的效果。不过,在增加了 cProfile 的钩子之后,大量的函数调用计数变成了瓶颈,增加了 heapq 算法的时间消耗。

总结

n^2 的算法毋庸置疑最慢,但同样是 n log n,依次插入方式的堆排序可能会比内置的 sort 函数稍快一些,但因为 CPython 本身的一些限制无法体现。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 序列的sort方法与bisectinsort,heapqheappush效率比较

相关文章

  • 2017-06-07 hibernate设置BATCH-SIZE=5SAVE10次,还是执行10次SELECT?
  • 2017-06-07 (python)爬取某淘宝店铺所有宝贝遇到的问题?
  • 2017-06-07 (python)如何从一个复杂的结构中优雅的提取出一列数据
  • 2017-06-07 PHP:如何在调用$obj->some_attr之前自动调用$obj->some_func
  • 2017-06-07 PythonWeb还是Python数据抓取前景好?
  • 2017-06-07 ejb发送消息部署到JBoss后运行程序报错。。。。。。。。
  • 2017-06-07 (python)djangomodels为生成的html元素添加样式。
  • 2017-06-07 (python)django序列化问题
  • 2017-06-07 显示所有文件和文件夹多媒体处理的文件同步和任务失败处理
  • 2017-06-07 Python中如何用正则匹配中文词组

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Java继承与多态问题急!!
    • 七牛phpSDK如何对HLS进行加密?
    • python3能否安装scrapy?
    • python初学分布式疑问,请pythoner帮忙看看,谢谢!
    • 7牛客户端(Android)如何向服务器申请上传凭证
    • 使用qiniu的sdk生成uploadtoken在hmac里报错
    • mongodb保存文件的时候不能识别一样的文件
    • (python)nginxgunicorn记录请求和响应内容
    • (laravel)hometead下载太慢了,能不能直接下个压缩包?
    • (ruby)有没有类似https://wwwsilkco/这样的自由灵活的数据呈现的产品和实现?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有