为何等价但代码更长的Python函数运行效率更高?
为什么代码更短的Python函数反而更慢?
你测试的两个功能等价的函数,出现了代码更短但性能更差的情况,核心原因在于额外的对象创建开销,具体分析如下:
两个函数的核心差异
先看你提供的两个函数代码:
def triplicate_1(nums): for i in nums: si = str(i) sum = 0 for j in si: sum += int(j) if sum % 3 == 0: pass else: pass def triplicate_2(nums): for i in nums: if sum([int(j) for j in str(i)]) % 3: pass pass
triplicate_1:直接用循环累加每个数字的各位和,全程只用到几个局部变量,没有额外创建容器类对象。triplicate_2:用[int(j) for j in str(i)]创建了一个临时列表,再把这个列表传给sum()计算总和。每处理一个数字,都会创建一次这个临时列表,用完后还要触发垃圾回收。
性能差异的根源
Python中创建列表是有明显开销的:
- 需要为列表分配内存空间;
- 列表中的每个元素也要单独存储;
- 临时列表使用完毕后,Python的垃圾回收机制需要回收这块内存。
当测试次数很少(比如10000次)时,这种额外开销可能被系统的其他因素(比如CPU缓存、进程调度波动)掩盖,出现偶然的结果偏差;但当测试次数足够多(比如100万次)时,统计规律会凸显,triplicate_1没有额外列表开销的优势就会稳定体现出来,所以大部分场景下它的耗时更短。
补充优化建议
如果想兼顾代码简洁和性能,可以用生成器表达式替代列表推导式,避免创建临时列表:
def triplicate_optimized(nums): for i in nums: if sum(int(j) for j in str(i)) % 3: pass pass
生成器表达式是惰性计算的,不会一次性创建完整列表,能大幅减少内存开销和垃圾回收的负担,性能会更接近triplicate_1。
内容的提问来源于stack exchange,提问作者Ramhand
相关产品推荐
相关产品推荐

