我是靠谱客的博主 魁梧老师,最近开发中收集的这篇文章主要介绍python不用sort排序给输入数字排序_替代python的.sort()(用于插入大型列表并保持其排序)...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

请参阅在列表上实现插入排序的原生bisect.insort(),这应该完全符合您的需求,因为

complexity is O(n) at best and O(n^2) at worst而不是O(nlogn)与您当前的解决方案(插入后求助).

但是,有更快的替代方法来构建排序数据结构,例如Skip Lists和二进制搜索树,它允许插入最多的复杂度O(log n)和最坏的O(n),或甚至更好的B树,Red-Black trees,在最佳和最差情况下都具有复杂度O(log n)的Splay树和AVL树.关于所有这些解决方案和其他解决方案的复杂性的更多信息可以在Eric Rowell的伟大BigO CheatSheet中找到.但请注意,所有这些解决方案都要求您安装第三方模块,通常需要使用C编译器进行编译.

但是,有一个名为sortedcontainers的纯python模块,它声称与AVL树和B树实现的C编译Python扩展一样快或更快(benchmark available here).

我对几个解决方案进行了基准测试,看看哪个是最快的插入排序:

sortedcontainers: 0.0860911591881

bisect: 0.665865982912

skiplist: 1.49330501066

sort_insert: 17.4167637739

这是我用来测试的代码:

from timeit import Timer

setup = """

L = list(range(10000)) + list(range(10100, 30000))

from bisect import insort

def sort_insert(L, x):

L.append(x)

L.sort()

from lib.skiplist import SkipList

L2 = SkipList(allowDups=1)

for x in L:

L2.insert(x)

from lib.sortedcontainers import SortedList

L3 = SortedList(L)

"""

# Using sortedcontainers.SortedList()

t_sortedcontainers = Timer("for i in xrange(10000, 10100): L3.add(i)", setup)

# Using bisect.insort()

t_bisect = Timer("for i in xrange(10000, 10100): insort(L, i)", setup)

# Using a Skip List

t_skiplist = Timer("for i in xrange(10000, 10100): L2.insert(i)", setup)

# Using a standard list insert and then sorting

t_sort_insert = Timer("for i in xrange(10000, 10100): sort_insert(L, i)", setup)

# Timing the results

print t_sortedcontainers.timeit(number=100)

print t_bisect.timeit(number=100)

print t_skiplist.timeit(number=100)

print t_sort_insert.timeit(number=100)

因此,结果表明排序的容器确实比bisect快了近7倍(我希望速度差距随着列表大小而增加,因为复杂性是一个数量级的不同).

更令人惊讶的是跳过列表比bisect慢,但可能是因为它没有像bisect一样优化,后者在C中实现并且可能使用一些优化技巧(注意我使用的skiplist.py模块是最快的 – Python Skip List我可以发现,pyskip module慢很多).

另外值得注意的是:如果您需要使用比列表更复杂的结构,则sortedcontainers模块提供SortedList,SortedListWithKey,SortedDict和SortedSet(而bisect仅适用于列表).此外,您可能对此somewhat related benchmark和complexity cheatsheet of various Python operations感兴趣.

最后

以上就是魁梧老师为你收集整理的python不用sort排序给输入数字排序_替代python的.sort()(用于插入大型列表并保持其排序)...的全部内容,希望文章能够帮你解决python不用sort排序给输入数字排序_替代python的.sort()(用于插入大型列表并保持其排序)...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部