如何使组合幂函数更快?

时间:2019-04-26 23:04:11

标签: python python-3.6

我非常快地完成了此功能,以找到列表中所有内容的组合力量,但是我敢肯定,有一种方法可以使其更快。它返回一个2项列表,合并后的能力和列表格式用于导出。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="box"></div>

<button id="anim-left"> Animate To Left </button>
<button id="anim-right"> Animate To Right </button>

4 个答案:

答案 0 :(得分:2)

这将比您当前拥有的更快地计算值:

import functools
import operator

l = [2, 3, 4]

functools.reduce(operator.pow, l)
## 4096 

如果您也想在列表中显示值链,就像在原始帖子中一样,您可以定义一个函数,例如像这样一个:

def func(vals):
  vals_string = '^'.join(str(val) for val in vals)
  total = functools.reduce(operator.pow, vals)
  return [total, vals_string]

用法示例:

l = [2, 3, 4, 5]
result = func(l)
print(result)
## [1152921504606846976, '2^3^4^5']

答案 1 :(得分:1)

您要避免进行一堆幂运算,因为它们很昂贵。乘法比较便宜,因此您可以通过将第一个值右边的所有值相乘,然后将第一个值提高到该幂来节省计算能力。

from functools import reduce
from operator import mul
from typing import List

def find(x: List[int]) -> int:
  return x[0]**reduce(mul, x[1:], 1)

您也可以这样做

def find(i: int, *updog: int) -> int:
  return i ** reduce(mul, updog, 1)

并像find(*[2,1,2,3,4])find(2, 1, 2, 3)这样称呼它。

无论哪种方式,它都使用函数签名来提供对设置初始值的更严格保证,而不是在列表为空的情况下具有未定义的行为。

答案 2 :(得分:0)

您可以使用NumPy的power.accumulate()获得累积指数。 但是,您很快就会遇到大量输入列表的问题。 [-1]在这里为您提供了所有元素的累积

import numpy as np

def find(x):
    total = np.power.accumulate(x)[-1]
    value = [total,'^'.join(map(str, inp))]
    return value

x = np.array([2,3,4,5])

print (find(x))
# [1152921504606846976, '2^3^4^5']

答案 3 :(得分:0)

您可以使用functools.reduce()

from functools import reduce
import operator

reduce(operator.pow, list)

reduce()的作用是将第一个参数应用于第二个元素中的每个元素。