Python3中for循环与max()函数的运行速度差异疑问
LeetCode 718题:Python两种取二维数组最大值方式的性能差异解析
在解决LeetCode第718题时,发现Python3中用嵌套for循环和内置max()函数获取二维数组最大值的运行速度差异明显:
- 嵌套for循环遍历dp数组取最大值时,运行时间超过9500-10000ms,触发超时(TLE);
- 使用
max(max(each) for each in dp)获取最大值时,运行时间为8000-9000ms,可通过测试。
以下是对应的代码:
class Solution: def findLength(self, nums1: List[int], nums2: List[int]) -> int: n = len(nums1) m = len(nums2) res = 0 dp = [[0]*(m+1) for i in range(n+1)] # dp[i][j] means the max length of both subarray ends at nums1[i] and nums2[j] for i in range(1,n+1): for j in range(1, m+1): if(nums1[i-1] == nums2[j-1]): dp[i][j] = dp[i-1][j-1] + 1 # using max, pass return max(max(each) for each in dp) # using for loops, TLE # for i in range(1, n+1): # for j in range(1, m+1): # res = max(dp[i][j], res) # return res
两者速度差异的核心原因如下:
- 底层实现的效率差:Python内置的
max()函数是用C语言实现的,执行时直接调用底层原生代码,跳过了Python解释器对字节码的处理开销。而纯Python写的嵌套for循环,每一次迭代、每一次max调用都要经过Python解释器的层层处理,累积下来耗时显著增加。 - 循环与操作的复杂度:嵌套for循环中,每次都要在Python层面执行
res = max(dp[i][j], res),两层循环的迭代逻辑也都是Python级别的;而max(max(each) for each in dp)的核心计算都由内置max完成,Python只负责迭代子列表,大部分计算逻辑在更高效的C层面执行。 - 生成器的迭代优化:
max(each) for each in dp是生成器表达式,生成器在迭代时的开销比显式的for循环更小,且内置max处理生成器时的效率也优于手动维护变量的循环逻辑。
内容的提问来源于stack exchange,提问作者Rimuru Tempest
相关产品推荐
相关产品推荐

