在下面的问题How do I sort a list with positives coming before negatives with values sorted respectively?中有一些解决方案,其中一个(我的建议)是使用numpy数组...我认为它会很快但它被证明是最慢的按数量级,这很好:),但为什么会这样呢?为方便起见,下面重复基准:
import numpy as np
from timeit import timeit
from bisect import bisect
def bisectme():
lst.sort()
i = bisect(lst, 0)
return lst[i:] + lst[:i]
def lexicon():
return sorted(lst, key=lambda x: (x < 0, x))
def comprehension():
return sorted([i for i in lst if i > 0]) + sorted([i for i in lst if i < 0])
def arrayme():
return np.concatenate([np.sort(ar[ar >= 0]), np.sort(ar[ar < 0])], axis=0)
lst = list(range(-10**1, 0, 1)) + list(range(10**1, -1, -1))
ar = np.array(lst)
print("bisectme:", timeit(bisectme))
print("lexicon:", timeit(lexicon))
print("comprehension:", timeit(comprehension))
print("arrayme:", timeit(arrayme))
# bisectme: 1.7116674770368263
# lexicon: 8.446330879000016
# comprehension: 5.8491336239967495
# arrayme: 10.91806474502664