Python3中用于计算pow(a,b)的内置函数的复杂性

时间:2018-01-27 07:02:09

标签: python python-3.x

将使用迭代的函数和事实 当n是偶数时, a n =(axa) n / 2 当n为奇数时, [(axa)(n-1)/ 2 ] xa 产生比python 3中的内置函数更好的结果。

1 个答案:

答案 0 :(得分:0)

不,您将无法执行Python内置操作。原因很简单,那些内置操作在CPython的情况下运行C代码。你不会通过编写Python代码来打败C代码。

如果我们专门考虑您的情况,您的解决方案将需要实例化多个整数或浮点对象,进行比较,乘以所有在Python中的!这是内置的 power 运算符不能做的事情,因为Python有一个指令来计算C中的幂并且只实例化一个对象,这是你想要的值。

我们可以看到使用dis来查看python字节码。

>>> import dis    
>>> dis.dis('a**b')
1         0 LOAD_NAME                0 (a)
          2 LOAD_NAME                1 (b)
          4 BINARY_POWER
          6 RETURN_VALUE

>>> dis.dis("""
r = 1
while b > 1:
    if b % 2:
        b = (b - 1) / 2
        a *= a
        r *= a
    else:
        b /= 2
        a *= a
r *= a""")

2         0 LOAD_CONST               0 (1)
          2 STORE_NAME               0 (r)

3         4 SETUP_LOOP              66 (to 72)
          6 LOAD_NAME                1 (b)
          8 LOAD_CONST               0 (1)
         10 COMPARE_OP               4 (>)
         12 POP_JUMP_IF_FALSE       70

4        14 LOAD_NAME                1 (b)
         16 LOAD_CONST               1 (2)
         18 BINARY_MODULO
         20 POP_JUMP_IF_FALSE       52

5        22 LOAD_NAME                1 (b)
         24 LOAD_CONST               0 (1)
         26 BINARY_SUBTRACT
         28 LOAD_CONST               1 (2)
         30 BINARY_TRUE_DIVIDE
         32 STORE_NAME               1 (b)

6        34 LOAD_NAME                2 (a)
         36 LOAD_NAME                2 (a)
         38 INPLACE_MULTIPLY
         40 STORE_NAME               2 (a)

7          42 LOAD_NAME                0 (r)
         44 LOAD_NAME                2 (a)
         46 INPLACE_MULTIPLY
         48 STORE_NAME               0 (r)
         50 JUMP_ABSOLUTE            6

9        52 LOAD_NAME                1 (b)
         54 LOAD_CONST               1 (2)
         56 INPLACE_TRUE_DIVIDE
         58 STORE_NAME               1 (b)

10       60 LOAD_NAME                2 (a)
         62 LOAD_NAME                2 (a)
         64 INPLACE_MULTIPLY
         66 STORE_NAME               2 (a)
         68 JUMP_ABSOLUTE            6
         70 POP_BLOCK

 11      72 LOAD_NAME                0 (r)
         74 LOAD_NAME                2 (a)
         76 INPLACE_MULTIPLY
         78 STORE_NAME               0 (r)
         80 LOAD_CONST               2 (None)
         82 RETURN_VALUE

我会让你猜出内置程序的效率是多么高效。