为什么这个python函数对包含为字符串的整数进行排序的速度比这个慢?

fdx2calv  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(407)

我有两个python函数,用于对作为字符串包含的整数列表进行排序。详情如下:

import random

n = 10000000
unsorted = [str(x) for x in range(n)]
random.shuffle(unsorted)

def sort_alg1(unsorted):
    unsorted.sort(key = lambda x: int(x))
    return unsorted

def sort_alg2(unsorted):
    l=list(map(int,unsorted))
    l.sort()
    s=list(map(str,l))
    return s

print(sort_alg1(unsorted))
print(sort_alg2(unsorted))

两种方法都能如期工作。然而,根据我的剖析器(我使用的是罗伯特·克恩(robert kern)一直流行的line_剖析器),第一个函数。 sort_alg1 执行速度比 sort_alg2 . 如果我能找出原因的话,这不会是一个大问题,但我不能。我已尝试查找内置数据库中的差异 sort() 方法与 map() 功能、lambda等均无效。如果有人能告诉我为什么会发生这种事,那就太好了!

dgsult0t

dgsult0t1#

做一些基准测试:

from timeit import timeit
import random

n = 1_000_000
unsorted = [str(x) for x in range(n)]
random.shuffle(unsorted)

def sort_alg1(unsorted):
    unsorted.sort(key=lambda x: int(x))
    return unsorted

def sort_alg2(unsorted):
    l = list(map(int, unsorted))
    l.sort()
    s = list(map(str, l))
    return s

t1 = timeit(lambda: sort_alg1(unsorted), number=1)
t2 = timeit(lambda: sort_alg2(unsorted), number=1)

print(t1)
print(t2)

印刷品:

0.4568827738985419
0.2486396620515734

看来 sort_alg2 速度更快。但原因是 sort_alg2 从接收已排序的数组 sort_alg1 . 如果您稍微更改基准:

t1 = timeit(lambda: sort_alg1(unsorted), number=1)
random.shuffle(unsorted)                      # <---- shufle again the array
t2 = timeit(lambda: sort_alg2(unsorted), number=1)

print(t1)
print(t2)

印刷品:

0.456114097032696
0.5958397497888654

所以第一个函数更快。

yyyllmsg

yyyllmsg2#

unsorted.sort 在功能上 sort_alg1 对列表进行适当排序,以便 sort_alg2 并不是从完全相同的版本开始的 unsorted 列表而且一次 sort_alg2 执行语句 l = list(map(int, unsorted)) , l 如果按整数值排序,则现在是一个完全排序的列表。所以 l.sort() 将在平凡的时间内运行。
注意 assert 声明 sort_alg2 功能:

import random

n = 10000000
unsorted = [str(x) for x in range(n)]
random.shuffle(unsorted)

def sort_alg1(unsorted):
    unsorted.sort(key = lambda x: int(x))
    return unsorted

def sort_alg2(unsorted):
    l=list(map(int,unsorted))
    # make a copy of l:
    l2 = l.copy()
    l.sort()
    assert(l == l2) # proof!
    s=list(map(str,l))
    return s

sort_alg1(unsorted)
sort_alg2(unsorted)

相关问题