Python中追加元素比替换元素的执行效率更高吗?
Python中列表append与元素替换的效率对比及你的前缀和代码优化
首先纠正个小细节:你贴的代码是实现**前缀和(Running Sum)**的,不是斐波那契数列,应该是描述时的小失误~
先说说你当前代码的核心效率问题
你的代码里每次循环都调用sum(nums[:i+1]),这会让时间复杂度直接升到O(n²)——因为每次求和都要重新遍历前i+1个元素,n次循环下来整体开销会随着数组长度增长急剧变大,这才是影响效率的关键,和替换元素本身关系不大。
回到你的核心疑问:append 是否比替换元素更高效?
分两种场景看:
- 如果列表已预先分配足够空间(比如你的代码里
newnums = nums[0:]已经创建了和原数组等长的列表),直接通过索引替换元素newnums[i] = ...是O(1)的操作,没有额外内存开销,效率很高。 - 如果列表未预先分配空间,每次
append时Python会自动扩容(通常是翻倍当前容量),扩容时会有内存拷贝的开销,但这种开销是**分摊O(1)**的——也就是平均下来每次append的成本依然很低,只有在触发扩容时才会有额外消耗。
为什么别人的高效解法用append?
不是因为append本身比替换快,而是他们的写法避免了重复求和,时间复杂度是O(n)。比如常见的高效前缀和写法:
class Solution(object): def runningSum(self, nums): res = [] current_sum = 0 for num in nums: current_sum += num res.append(current_sum) return res
如果把这种逻辑改成预先分配列表再替换元素,效率几乎一致:
class Solution(object): def runningSum(self, nums): res = [0] * len(nums) current_sum = 0 for i in range(len(nums)): current_sum += nums[i] res[i] = current_sum return res
这两个版本都是O(n)时间复杂度,单次内存操作都是O(1),实际运行效率差别极小。
总结
- 当列表已有足够空间时,替换元素和append的单次操作效率接近,append的分摊成本也是O(1)
- 你当前代码的效率瓶颈不在替换元素,而是重复调用
sum导致的O(n²)时间复杂度 - 不管用append还是预先分配列表替换,只要逻辑是累加当前和(而非重复求和),就能达到高效的O(n)解法
内容的提问来源于stack exchange,提问作者ENGSSG
相关产品推荐
相关产品推荐

