0
点赞
收藏
分享

微信扫一扫

【Python性能优化实例】计算前缀和(itertools.accumulate)


根据官方文档:​​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 节约了一次边界判定的判断时间。


举报

相关推荐

计算机性能优化

0 条评论