MST

星途 面试题库

面试题:Python循环条件判断优化之性能极致优化

在处理一个非常大的数据集(假设为一个包含数百万个整数的列表)时,需要在循环中对每个整数进行复杂的条件判断,条件判断涉及多个逻辑运算以及函数调用,例如: ```python import math large_list = list(range(1000000)) result = [] for num in large_list: if math.sqrt(num) > 100 and num % 7 == 0 and (lambda x: x % 13 == 0)(num): result.append(num) ``` 请从底层原理出发,对这段代码的循环条件判断进行深度优化,以达到极致的性能提升,同时说明优化方案对内存、计算资源等方面的影响。
29.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 优化方案
    • 减少函数调用:在原代码中,math.sqrt(num)是一个函数调用,每次循环都调用该函数会带来额外的开销。可以考虑预先计算好100的平方值,即10000,这样在条件判断中直接使用num > 10000,避免了每次调用math.sqrt函数。
    • 减少逻辑运算:按位与(&)操作在底层硬件层面比and逻辑操作更高效(在某些情况下,特别是在大量数据处理时)。但是对于Python中的整数运算,这里逻辑判断主要涉及整数的比较和取模运算,按位与并不适用。不过,可以考虑先判断最可能为False的条件,减少后续不必要的判断。在这个例子中,num > 10000是最可能快速排除大部分数字的条件,所以放在最前面。
    • 使用生成器表达式:原代码使用列表来存储结果,这会占用大量内存。可以使用生成器表达式,在需要时逐个生成符合条件的数字,而不是一次性存储所有结果。

优化后的代码如下:

import math
large_list = list(range(1000000))
square_100 = 100 * 100
result_generator = (num for num in large_list if num > square_100 and num % 7 == 0 and num % 13 == 0)
# 如果确实需要将结果转换为列表,可使用
# result = list(result_generator)
  1. 对内存、计算资源的影响
    • 内存方面
      • 优化前:原代码将所有符合条件的数字存储在result列表中,对于数百万个整数的数据集,如果有大量数字符合条件,会占用大量内存。
      • 优化后:使用生成器表达式,只有在实际迭代生成器时才会产生数字,不会一次性占用大量内存,极大地减少了内存使用量。
    • 计算资源方面
      • 优化前:每次循环都调用math.sqrt函数,函数调用在底层涉及栈操作等额外开销,增加了计算资源的消耗。
      • 优化后:避免了math.sqrt函数调用,同时通过调整条件顺序,可能减少了部分不必要的条件判断,从而在一定程度上减少了计算资源的消耗,提升了性能。