此外,由all()函数的帮助信息可知,_allenumk()其实是_forloop()的等效形式 。
2.5 numpy
def IsListSorted_numpy(arr, key=lambda dif: dif = 0):
import numpytry:if arr.dtype.kind == 'u': #无符号整数数组执行np.diff时存在underflow风险
arr = numpy.int64(lst)except AttributeError:pass #无dtype属性,非数组
return (key(numpy.diff(arr))).all() #numpy.diff(x)返回相邻数组元素的差值构成的数组
NumPy是用于科学计算的Python基础包,可存储和处理大型矩阵 。它包含一个强大的N维数组对象 , 比Python自身的嵌套列表结构(nested list structure)高效得多 。第三节的实测数据表明,_numpy()处理大型列表时性能非常出色 。
在Windows系统中可通过pip install numpy命令安装NumPy包,不建议登录下载文件自行安装 。
2.6 reduce
def IsListSorted_reduce(iterable, key=lambda x, y: x = y):
cmpFunc = lambda x, y: y if key(x, y) else float('inf')return reduce(cmpFunc, iterable, .0)float('inf')
reduce实现是all实现的变体 。累加器(accumulator)中仅存储最后一个检查的列表元素,或者Infinity(若任一元素小于前个元素值) 。
前面2.1~2.5小节涉及下标操作的函数适用于列表等可迭代对象(Iterable) 。对于通用迭代器(Iterator)对象,即可以作用于next()函数或方法的对象,可使用_reduce()及后面除_rand()外各小节的函数 。迭代器的计算是惰性的 , 只有在需要返回下一个数据时才会计算,以避免不必要的计算 。而且,迭代器方式无需像列表那样切片为两个迭代对象 。
2.7 imap
def IsListSorted_itermap(iterable, key=lambda x, y: x = y):
from itertools import imap, tee
a, b = tee(iterable) #为单个iterable创建两个独立的iterator
next(b, None)return all(imap(key, a, b))
2.8 izip
def IsListSorted_iterzip(iterable, key=lambda x, y: x = y):
from itertools import tee, izip
a, b = tee(iterable)next(b, None)return all(key(x, y) for x, y in izip(a, b))def pairwise(iterable):
from itertools import tee, izip
a, b = tee(iterable)next(b, None)return izip(a, b) #"s - (s0,s1), (s1,s2), (s2, s3), ..."def IsListSorted_iterzipf(iterable, key=lambda x, y: x = y):
return all(key(a, b) for a, b in pairwise(iterable))
第三节的实测数据表明,虽然存在外部函数调用,_iterzipf()却比_iterzip()略为高效 。
2.9 fast
def IsListSorted_fastd(lst):
it = iter(lst)try:
prev = it.next()except StopIteration:return True
for cur in it:if prevcur:return False
prev = curreturn Truedef IsListSorted_fastk(lst, key=lambda x, y: x = y):
it = iter(lst)try:
prev = it.next()except StopIteration:return True
for cur in it:if not key(prev, cur):return False
prev = curreturn True
_fastd()和_fastk()是Stack Overflow网站回答里据称执行最快的 。实测数据表明 , 在列表未排序时 , 它们的性能表现确实优异 。
2.10 random
import randomdef IsListSorted_rand(lst, randNum=3, randLen=100):
listLen = len(lst)if listLen = 1:return True
#由首个元素和末尾元素猜测可能的排序规则
if lst[0]lst[-1]: #列表元素升序
key = lambda dif: dif = 0
else: #列表元素降序或相等
key = lambda dif: dif = 0
threshold, sortedFlag = 10000, True
import numpyif listLen = threshold or listLen = randLen*2 or not randNum:return (key(numpy.diff(numpy.array(lst)))).all()from random import samplefor i in range(randNum):
sortedRandList = sorted(sample(xrange(listLen), randLen))
flag = (key(numpy.diff(numpy.array([lst[x] for x in sortedRandList])))).all()
sortedFlag = sortedFlag and flagreturn sortedFlag
_rand()借助随机采样降低运算规模,并融入其他判断函数的优点 。例如,猜测列表可能的排序规则,并在随机采样不适合时使用相对快速的判断方式,如NumPy 。
推荐阅读
- 路由器有网怎么连接电视机,路由器无线连接电视机
- 做社交电商如何推广,做社交电商如何推广自己
- 荣耀鸿蒙固件下载安装不了,荣耀安装鸿蒙系统
- 在家健身直播录屏,在家健身直播录屏违法吗
- vb.net按行读取 vb读取excel指定行指定列
- qq服务器,服务器在哪
- 电脑矩形帧是什么意思,电脑矩形截屏的快捷键
- php将输出数据库中的值 php将输出数据库中的值变为0
- 有什么是快手上的直播,有什么是快手上的直播间