I have a function which evaluates terms of a polynomial in several variables. The inputs are lists of powers of each variable. For example, for two variables and 2nd order it looks like this,
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]
In reality the function is higher order and has many variables so on average there are a few thousand terms (in fact, I create the function at run time with an eval statement, but that’s not important). The function is on an inner most loop and is currently a speed bottleneck. The profiler tells me I spend most of the time in __times__.
Short of creating a C extension module, can anyone see any room for optimization?
Edit: The example above is trying to evaulate 1 + x + y + xy + x^2 + y^2 with x = 2and y = 3, except without adding them, just putting each term in a list.
Adding them is fine (with some coefficients A, B, …) i.e. all I’m trying to do is compute:
A + B*x + C*y + D*x*y + E*x^2 + F*y^2.
I’m not sure from which version, but numpy should have a
polyval2d(x,y,c)function into thepolynomialmodule, that will perfectly apply to your example.You seemed interested in expanding your example to a much higher dimension.
In the same module there’s a
polyval3d(x,y,z,c), if that’s not enought I’d suggest (as I guess you’re already doing) to look at the source code. It shouldn’t be too hard to implement what best suits your needs, and you can always ask here on SO 🙂