2

我有一个函数可以评估多个变量中的多项式项。输入是每个变量的幂列表。例如,对于两个变量和二阶,它看起来像这样,

def f(x,y):
    return [1, x[1], y[1], x[1]*y[1], x[2], y[2]]

x = [2**0, 2**1, 2**2]
y = [3**0, 3**1, 3**2]

>>> f(x,y)
[1,2,3,6,4,9]

实际上,该函数是更高阶的并且具有许多变量,因此平均有几千个术语(实际上,我在运行时使用 eval 语句创建了该函数,但这并不重要)。该函数位于最内层循环中,目前是速度瓶颈。分析器告诉我,我大部分时间都花在 __times__ 上。

没有创建 C 扩展模块,任何人都可以看到任何优化空间吗?

编辑:上面的例子试图1 + x + y + xy + x^2 + y^2x = 2and进行评估y = 3,除了不添加它们,只是将每个术语放在一个列表中。

添加它们很好(带有一些系数 A,B,...),即我要做的就是计算:

A + B*x + C*y + D*x*y + E*x^2 + F*y^2.

4

2 回答 2

3

我不确定从哪个版本开始,但是 numpy 应该polyval2d(x,y,c)在模块中有一个功能polynomial,这将完全适用于您的示例。

您似乎有兴趣将您的示例扩展到更高的维度。

在同一个模块中有一个polyval3d(x,y,z,c),如果这还不够,我建议(我猜你已经在做)查看源代码。实施最适合您需求的东西应该不会太难,您可以随时在 SO 上提问 :)

于 2012-04-08T09:00:03.670 回答
0

该函数位于最内层循环中,目前是速度瓶颈。

您可以尝试通过使用 NumPy 并用更高维度的数组替换变量来完全摆脱循环。

于 2012-04-08T14:52:56.280 回答