电脑izip是什么软件

电脑izip是什么软件,第1张

是一款解压缩软件。

数据压缩包含了非常多的软件和硬件技术,这些技术各不相同,但是大多数压缩软件都是基于LZ77、LZ88算法并加以修正而成,而LZ77是字典压缩的起源。

一个文本文件是由一些单词组成,而且必定有重复现象发生。

例如我们这里经常出现的“压缩软件”一词,压缩的原理就是在文件的头部做一个类似字典的东西,把“压缩软件”这个词放在“字典”中,并为这个词指定一个占较少字节数的编码,皮禅而文章中的“压缩软件”一词均用此编码代替,以达到压缩的目的。

ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,燃肆尘发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格雹世式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为application/zip。

当前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7z格式。从性能上比较,RAR及7z格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。

Microsoft从Windows ME *** 作系统开始内置对zip格式的支持,即使用户的计算机上没有安装解压缩软件,也能打开和制作zip格式的压缩文件,OS X和流行的Linux *** 作系统也对zip格式提供了类似的支持。

因此如果在网络上传播和分发文件,zip格式往往是最常用的选择。

本节判断列表排序的函数名格式为IsListSorted_XXX()。为简洁起见,除代码片段及其输出外,一律以_XXX()指代。

2.1 guess

def IsListSorted_guess(lst):

listLen = len(lst)if listLen <= 1:return True

#由首个元素和末尾元素猜测可能的排序规则

if lst[0] == lst[-1]: #列表元素相同

for elem in lst:if elem != lst[0]: return False

elif lst[0] <lst[-1]: #列表元素升序

for i, elem in enumerate(lst[1:]):if elem <lst[i]: return False

else: #列表元素降序

for i, elem in enumerate(lst[1:]):if elem >lst[i]: return False

return True

_guess()是最通用的实现,几乎与语言无关。值得注意的是,该函数内会猜测给定列表可能的排序规则,因此无需外部调用者指明排序规则。

2.2 sorted

def IsListSorted_sorted(lst):

return sorted(lst) == lst or sorted(lst, reverse=True) == lst

_sorted()使用Python内置函数sorted()。由于sorted()会对未排序的列表排序,_sorted()函数主要适用于已排序列表。

若想判断列表未排序后再对其排序,不如直接调用列表的sort()方法,因为该方法内部会判断列表是否排序。对于已排序列表,该方法的时间复杂度为线性阶O(n)——判大升虚断为O(n)而排序为O(nlgn)。

2.3 for-loop

def IsListSorted_forloop(lst, key=lambda x, y: x <= y):

for i, elem in enumerate(lst[1:]): #注意,enumerate默认迭代下标从0开始

if not key(lst[i], elem): #if elem >lst[i]更快,但通用性差

return False

return True

无论列表是否已排序,本函数的时间复杂度均为线性阶O(n)。注意,参数key表明缺省的排序规则为升序。

2.4 all

def IsListSorted_allenumk(lst, key=lambda x, y: x <= y):

return all(key(lst[i], elem) for i, elem in enumerate(lst[1:]))import operatordef IsListSorted_allenumo(lst, oCmp=operator.le):

return all(oCmp(lst[i], elem) for i, elem in enumerate(lst[1:]))def IsListSorted_allenumd(lst):

return all((lst[i] <= elem) for i, elem in enumerate(lst[1:]))def IsListSorted_allxran(lst, key=lambda x,y: x <= y):

return all(key(lst[i],lst[i+1]) for i in xrange(len(lst)-1))def IsListSorted_allzip(lst, key=lambda x,y: x <= y):

from itertools import izip #Python 3中zip返回生成器(generator),而izip被废弃

return all(key(a, b) for (a, b) in izip(lst[:-1],lst[1:]))

lambda表达式与operator运算符速度相当,前者简单灵活,后者略为高效(实测并不一定)。但两者速度均不如列表元素直接比较(可能存在调滚燃用开销)。亦即,_allenumd()快于_allenumo()快笑缓于_allenumk()。

若使用lambda表达式指示排序规则,更改规则时只需要改变x和y之间的比较运算符;若使用operator模块指示排序规则,更改规则时需要改变对象比较方法。具体地,lt(x, y)等效于x <y,le(x, y)等效于x <= y,eq(x, y)等效于x == y,ne(x, y)等效于x != y,gt(x, y)等效于x >y,ge(x, y)等效于x >= y。例如,_allenumo()函数若要严格升序可设置oCmp=operator.lt。

此外,由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 prev >cur: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。

通过line_profiler分析可知,第20行和第21行与randLen有关,但两者耗时接近。因此randLen应小于listLen的一半,以抵消sorted开销。除内部限制外,用户可以调节随机序列个数和长度,如定制单个但较长的序列。

注意,_rand()不适用于存在微量异常数据的长列表。因为这些数据很可能被随机采样遗漏,从而影响判断结果的准确性。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12170896.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存