序⾔
在开发过程中经常会遇到对可迭代对象进⾏for循环的操作,甚⾄双重编写for循环进⽽找到匹配条件的数据,
某些逻辑上这些操作往往⽆法避免,但可以通过⼀些⽅法使得代码不那么冗余和提升代码效率
循环的情况
1、循环⽐较
双重循环获取对象并进⾏⽐较
>>> a1 = [1, 3, 5, 2, 10]
>>> a2 = [5, 6, 1, 8]
>>> for i in a1:
for j in a2:
if i < j:
print(i,j)
...
(1, 5)
(1, 6)
(1, 8)
(3, 5)
(3, 6)
(3, 8)
(5, 6)
(5, 8)
(2, 5)
(2, 6)
(2, 8)
复制代码
可以通过itertools包对此种循环进⾏优化,不仅使得代码复杂度降低,也提升了执⾏速度
a1 = [1, 3, 5, 2, 10]
a2 = [5, 6, 1, 8]
@count_time
def base_func():
for i in a1:
for j in a2:
if i < j:
print(i, j)
@count_time
def itertools_func():
for i in itertools.product(a1, a2):
if i[0] < i[1]:
print(i)
if __name__ == '__main__':
base_func()
itertools_func()
# 8.106231689453125e-06
# 4.053115844726562e-06
复制代码
2、循环展开
将复杂嵌套数据内容展开,可以使⽤推导式进⾏实现
@count_time
def base_func():
result = []
for a in a1:
for j in a:
result.append(j)
@count_time
def itertools_func():
value = [i for value in a1 for i in value]
if __name__ == '__main__':
print(base_func())
print(itertools_func())
# 8.106231689453125e-06
# 4.053115844726562e-06
复制代码
3、已知集合⼤⼩
在已知集合⼤致数量进⾏双重for循环处理数据时,应该采⽤外⼩内⼤的原则,把⼤循环写在⾥⾯,⼩循环写在外边
@count_time
def outer_func():
for i in range(10):
for j in range(10000):
if i == j:
print(i, j)
@count_time
def inner_func():
for i in range(10000):
for j in range(10):
if i == j:
print(i, j)
# 0.003239154815673828
# 0.004751205444335937