Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,排序具有非常大数字的列表的最佳算法是什么 n=input()##0_Python_Python 2.7 - Fatal编程技术网

在python中,排序具有非常大数字的列表的最佳算法是什么 n=input()##0

在python中,排序具有非常大数字的列表的最佳算法是什么 n=input()##0,python,python-2.7,Python,Python 2.7,简短回答:一个项目少于500000的整数列表在排序小数字和排序大数字时,性能差异可以忽略不计。基于列表中的整数范围,数百万个项目中的整数列表将具有截然不同的排序时间 一组快速基准: n=input() ##0<n<10000 m=[] for i in range(n): m.append(input()) m.sort() for i in range(n): print m[i] 使用运行Python 3.5.2的list.sort()进行排序 当N为5000时

简短回答:一个项目少于500000的整数列表在排序小数字和排序大数字时,性能差异可以忽略不计。基于列表中的整数范围,数百万个项目中的整数列表将具有截然不同的排序时间

一组快速基准:

n=input() ##0<n<10000
m=[]
for i in range(n):
    m.append(input())
m.sort()
for i in range(n):
    print m[i]
使用运行Python 3.5.2的
list.sort()
进行排序

当N为5000时,两个列表的排序时间均为0.0秒

当N为50000时,排序时间分别为.014秒和.016秒(可忽略差异)

当N为500000时,排序时间分别为.17秒和.23秒(50%的增量,但差异仍然可以忽略不计)

当N为5000000时,排序时间分别为2.1秒和3.6秒(71%的增量,明显的差异)

结论:如果列表大小小于500K个整数,则无论整数范围如何,排序时间都可以忽略不计。op的代码表示N小于10K

一旦进入“数百万个整数”列表,我们就会看到性能的更大波动,特别是在使用不同的python解释器时

list1 = A list of N integers of range 0-100000

list2 = Another list of N integers of range 0-10**50

python中的列表速度很慢。您可以使用一些优化的模块,如
numpy
,以实现更快的数组操作。@MrPyCharm内置的Python列表排序算法非常快。我认为排序时间不应该取决于排序值。您确定您的数字符合数据类型吗?我认为10^50必须表示为浮点数,以防止溢出。可能排序很慢,因为您要将列表中的所有整数来回转换为浮点数?您在将所有数字放入列表时是否尝试过将其转换为浮点数?@peci1-与大多数编译语言(C、Java)不同,Python的整数类型具有无限的精度。@selbie噢,这可以解释不同的复杂性。同样值得注意的是:我看到Python 2.7、Python 3.5和PyPy之间在性能上存在一些巨大差异。不确定Python是否有正式的基准测试,但看到它们之间的差异是很有趣的。@YasiruRandeepa-我很高兴它有帮助,欢迎使用Stack Overflow。如果答案解决了你的问题或回答了你的问题,不要忘记“接受”答案。
def createRandomNumber(number_of_digits):
    x = 0
    number_of_digits = int(number_of_digits)
    for i in range(number_of_digits):
        x = x*10 + int(10 * random.random())
    return x

def createRandomNumberList(max_digits, count):
    l = []
    for i in range(count):
        l.append(createRandomNumber(random.random()*max_digits+1))
    return l


list1 = createRandomNumberList(5,  50000)
list2 = createRandomNumberList(50, 50000)


print("sorting list1")
start1 = time.time()
list1.sort()
end1 = time.time()


print("sorting list2")
start2 = time.time()
list2.sort()
end2 = time.time()

print("time to sort list1: ", end1-start1)
print("time to sort list2: ", end2-start2)