面试题答案
一键面试- 优化方案:
- 减少函数调用:在原代码中,
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)
- 对内存、计算资源的影响:
- 内存方面:
- 优化前:原代码将所有符合条件的数字存储在
result
列表中,对于数百万个整数的数据集,如果有大量数字符合条件,会占用大量内存。 - 优化后:使用生成器表达式,只有在实际迭代生成器时才会产生数字,不会一次性占用大量内存,极大地减少了内存使用量。
- 优化前:原代码将所有符合条件的数字存储在
- 计算资源方面:
- 优化前:每次循环都调用
math.sqrt
函数,函数调用在底层涉及栈操作等额外开销,增加了计算资源的消耗。 - 优化后:避免了
math.sqrt
函数调用,同时通过调整条件顺序,可能减少了部分不必要的条件判断,从而在一定程度上减少了计算资源的消耗,提升了性能。
- 优化前:每次循环都调用
- 内存方面: