为什么这种方法更快?x=list(range(0,1000000,3))z=list(range(0,1000000,5))y=list(range(0,1000000,15))%timeit sum(x)+sum(z)-sum(y)24 ms ± 1.25 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)为什么列表理解较慢?%timeit sum([i for i in range(1000000) if i % 3 == 0 or i % 5 == 0])205 ms ± 7.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)我认为列表理解应该更快。有没有其他方法比这两种方法更快?
2 回答

慕森卡
TA贡献1806条经验 获得超8个赞
可能有两个部分会减慢第二部分的速度:余数函数 (%) 和必须遍历所有项目。第一个只需要按 3、5 或 15 的倍数向上计数,直到达到数字。
但是,如果你真的想最优化它,你应该只使用整数除法: 1000000//3 + 1000000//5 - 1000000//15
编辑:这不能回答问题,正如 Onyambu 在下面评论的那样。更快的方法是找到平均值并乘以数字。例如,以下将计算小于或等于 1000000 的 3 的倍数之和: ((1000000//3)*(1000000//3 * 3 + 3))//2
。找出不超过1000000的3的倍数,然后乘以最大倍数(1000000//3 * 3
)和最小倍数(3
)的平均值。
添加回答
举报
0/150
提交
取消