根据官方文档:https://docs.python.org/zh-cn/3/library/itertools.html#itertools.accumulate
比较常见的有如下三种计算前缀和的方式:
>>> import timeit
方法 1
>>> timeit.timeit(
... "list(accumulate(n))",
... setup="from itertools import accumulate\n"
... "n = [1, 3, 5] * 100",
... number=100000
... )
0.7947895000000074
方法 2
>>> timeit.timeit(
... "m = list(n)\n"
... "for i in range(1, len(n)):\n"
... " m[i] += m[i - 1]",
... setup="from itertools import accumulate\n"
... "n = [1, 3, 5] * 100",
... number=100000
... )
2.549676000000005
方法 3
>>> timeit.timeit(
... "m = []\n"
... "for num in n:\n"
... " if not m:\n"
... " m.append(num)\n"
... " else:\n"
... " m.append(m[-1] + num)\n",
... setup="from itertools import accumulate\n"
... "n = [1, 3, 5] * 100",
... number=100000
... )
2.927691999999979
通过 Python 3.9 的运行时间来看,使用 itertools.accumulate
(方法 1)的效率显然是最高的。
方法 2 之所以略快于方法 3,是因为:
- 方法 2 直接初始化了定长的结果数组
m
,节约了数组扩容摊销的时间; - 方法 2 相较于方法 3 节约了一次边界判定的判断时间。