Summing with a for loop faster than with reduce?

前端 未结 3 2076
庸人自扰
庸人自扰 2020-12-17 19:19

I wanted to see how much faster reduce was than using a for loop for simple numerical operations. Here\'s what I found (using the standard timeit library):

I         


        
3条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-17 20:11

    The reduce(add, r) must invoke the add() function 100 times, so the overhead of the function calls adds up -- reduce uses PyEval_CallObject to invoke add on each iteration:

    for (;;) {
        ...
        if (result == NULL)
            result = op2;
        else {
            # here it is creating a tuple to pass the previous result and the next
            # value from range(100) into func add():
            PyTuple_SetItem(args, 0, result);
            PyTuple_SetItem(args, 1, op2);
            if ((result = PyEval_CallObject(func, args)) == NULL)
                goto Fail;
        }
    

    Updated: Response to question in comments.

    When you type 1 + 2 in Python source code, the bytecode compiler performs the addition in place and replaces that expression with 3:

    f1 = lambda: 1 + 2
    c1 = byteplay.Code.from_code(f1.func_code)
    print c1.code
    
    1           1 LOAD_CONST           3
                2 RETURN_VALUE         
    

    If you add two variables a + b the compiler will generate bytecode which loads the two variables and performs a BINARY_ADD, which is far faster than calling a function to perform the addition:

    f2 = lambda a, b: a + b
    c2 = byteplay.Code.from_code(f2.func_code)
    print c2.code
    
    1           1 LOAD_FAST            a
                2 LOAD_FAST            b
                3 BINARY_ADD           
                4 RETURN_VALUE         
    

提交回复
热议问题