求和函数与长期加法

时间:2014-07-17 09:59:03

标签: python performance cpython built-in

我想知道sum()内置是否有长期添加的延迟?

sum(filter(None, [a, b, c, d]))

a + b + c + d

假设我正在使用CPython?

感谢

编辑:如果这些变量是小数,怎么办?

1 个答案:

答案 0 :(得分:2)

一个简单的例子(请注意,为了试图更公平,sum版本采用tuple参数,因此您不包括构建该结构(a, b, c, d)的时间,并且不包括不必要的filter):

>>> import timeit
>>> def add_up(a, b, c, d):
    return a + b + c + d

>>> def sum_up(t):
    return sum(t)

>>> t = (1, 2, 3, 4)
>>> timeit.timeit("add_up(1, 2, 3, 4)", setup="from __main__ import sum_up, add_up, t")
0.2710826617188786
>>> timeit.timeit("sum_up(t)", setup="from __main__ import sum_up, add_up, t")
0.3691424539089212

这几乎是不可避免的 - add_up没有任何函数调用开销,只需要3个二进制加法。但是不同的形式有不同的用途 - sum并不关心给它多少项,而你必须用+写出每个名字。在具有固定数量项目的示例中,速度至关重要,+具有优势,但对于几乎所有一般情况sum都是可行的。

使用Decimal s:

>>> t = tuple(map(Decimal, t))
>>> a = Decimal(1)
>>> b = Decimal(2)
>>> c = Decimal(3)
>>> d = Decimal(4)
>>> timeit.timeit("add_up(a, b, c, d)", setup="from __main__ import sum_up, add_up, t, a, b, c, d")
0.5005962150420373
>>> timeit.timeit("sum_up(t)", setup="from __main__ import sum_up, add_up, t, a, b, c, d")
0.7599533142681025