【问题标题】:Efficient sum of products产品的有效总和
【发布时间】:2021-08-30 19:57:42
【问题描述】:

我希望编写以下产品总和:

以 Python 中最有效的方式。

注意f(j,i)g(k, i) 只是索引的一些函数,通常是 j^c_1/i^c_2 形式的分数。此外,当 i ==j 时,第一个产品必须评估为1。我有一个克罗内克三角洲作为解决这个问题的方法,但欢迎就如何强加此类条件提出每一个建议。

问题是我需要这种“限制”行为,因此,我想迭代大量n。我以前没有写过产品,主要是总和,我想知道如何继续这个。我或多或少熟悉循环,但我读过还有其他更有效的方法来实现这一点,例如迭代器。

执行此操作的最佳方法是什么,您能否提供一个可行的示例? 到目前为止,我的尝试是非常基础的,因为我知道总和/乘积的结构,但不知道如何评估它。 这是我目前所拥有的:

product_1 = 1
product_2 = 1
for i in range(a, n + 1, 1):
    for j in range(a, n + 1, 1):
        if i == j 
            something to make the product 1
        else:
            product_1 *= f(i,j)
    for k in range(b, n + 1, 1):
        product_2 *= g(i,k)

然后以某种方式计算乘积并在某处有一个求和变量?

【问题讨论】:

  • 什么尝试?我在这里没有看到任何尝试。
  • @ScottHunter 感谢您的评论。我的问题在任何地方都没有说明:“这是我的尝试”或任何类似的东西。我犹豫是否要包括它,因为它非常基本。我应该这样做吗?
  • 您应该始终包含您的尝试;它使您更容易说出您遇到的困难。
  • @ScottHunter 谢谢,你是对的。我已经这样做了,但我很有信心它远未完成。如您所知,我不确定如何计算产品的时间然后取它们的总和。

标签: numpy loops optimization


【解决方案1】:

编写此代码的简单方法是:

result = 0
for i in range(a, n + 1, 1):
    product_1 = 1
    product_2 = 1
    for j in range(a, n + 1, 1):
        if i != j:
            product_1 *= f(i,j)
    for k in range(b, n + 1, 1):
        product_2 *= g(i,k)
    result += product_1 * product_2

要为您的代码计时,我建议您查看this page,这是对 Python 计时的一个很好的介绍。

要更快地评估它,请检查 map 运算符,或者,如果您想使用 NumPy,请检查 numpy.vectorize 函数,您可以在此上下文中使用该函数对 fg 进行矢量化。您还可以对外部循环进行矢量化。

【讨论】:

    猜你喜欢
    • 2019-07-02
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多