猿问

更快地处理 3 和 5 的倍数

为什么这种方法更快?


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)

我认为列表理解应该更快。有没有其他方法比这两种方法更快?


心有法竹
浏览 136回答 2
2回答

慕森卡

可能有两个部分会减慢第二部分的速度:余数函数 (%) 和必须遍历所有项目。第一个只需要按 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)的平均值。
随时随地看视频慕课网APP

相关分类

Python
我要回答