Contents
python any()说明
api来源于DevDocs,从中可以看到any()
的作用是接受一个iterable
对象,遍历其中的元素,如果发现有一个是True
,则返回一个True
,这也符合any
这个词的含义。
实际使用
下面演示的是获取指定范围内的质数,对数n
判断是否为质数,其实可以利用已经知道的质数,如果n
对已知的某一个质数p
可以整除,那么就可以直接知道n
不是一个质数。
import time # 记录程序耗时
# 保存质数
primes = []
# python decorator,记录函数调用耗费的时间
def timer(f):
def inner(*args, **kwargs):
start = time.time()
x = f(*args, **kwargs)
end = time.time()
print("time: {} s".format(end - start))
return x
return inner
@timer
def get_primes(high=10000):
# 判断n是否为质数,从2~sqrt(n)进行逐个比较
def is_prime(n):
x = 2
while x ** 2 <= n:
if n % x == 0:
return False
x += 1
return True
# 判断2~high的每个数是否为质数
for i in range(2, high + 1):
if any([i % x == 0 for x in primes]):
continue
if is_prime(i):
primes.append(i)
# 替换给定的默认参数,给一个比较大的值,观察程序耗时
# 这种方式下:2083s
get_primes(high=1000000)
注意演示代码中的第31
,这里使用了any()
函数,传入的是一个列表推导式,作为list
传递给any()
。这里耗时2083s,30分钟左右。
改一点点:
import time # 记录程序耗时
# 保存质数
primes = []
# python decorator,记录函数调用耗费的时间
def timer(f):
def inner(*args, **kwargs):
start = time.time()
x = f(*args, **kwargs)
end = time.time()
print("time: {} s".format(end - start))
return x
return inner
@timer
def get_primes(high=10000):
# 判断n是否为质数,从2~sqrt(n)进行逐个比较
def is_prime(n):
x = 2
while x ** 2 <= n:
if n % x == 0:
return False
x += 1
return True
# 判断2~high的每个数是否为质数
for i in range(2, high + 1):
if any(i % p == 0 for p in primes):
continue
if is_prime(i):
primes.append(i)
# 替换给定的默认参数,给一个比较大的值,观察程序耗时
# 这种方式下:241s
get_primes(high=1000000)
将31行的if any([i % x == 0 for x in primes]):
替换成了if any(i % p == 0 for p in primes):
,也就是列表推导式外面的容器,由list
变成了tuple
,时间上从2083s
缩短为241s
。。。
总结
any()
可以接受的可迭代对象,包括tuple
,list
,dict
,set
,但是对于列表推导式,显然用tuple
包裹的效率比list
高。从这里也告诉我们,在使用列表推导式时,应该使用tuple
包裹。