2012-04-08 30 views
2

我有一個函數可以評估多個變量中多項式的項。輸入是每個變量的權力列表。例如,對於兩個變量和二階它看起來像這樣,優化Python多項式評估

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擴展模塊的缺點,任何人都可以看到任何優化空間?

編輯:上面的例子試圖evaulate 1 + x + y + xy + x^2 + y^2x = 2y = 3,除了沒有加入他們,只是把每學期在列表中。

添加它們是好的(有一些係數A,B,...),即所有我想要做的是計算:

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

+0

函數多久調用一次相似或相同的參數? – 2012-04-08 07:53:45

+0

我真的不確定你的腳本是做什麼的,但你有沒有試過看scipy/numpy? – 2012-04-08 07:55:02

+0

@NolenRoyalty很好的問題,不幸的是答案是每個變量每次都是不同的。 – marius 2012-04-08 08:00:25

回答

3

我不確定哪個版本,但numpy應該有polyval2d(x,y,c)功能到polynomial模塊,這將完全適用於您的示例。

您似乎有興趣將您的示例擴展到更高維度。

在同一模塊中有一個polyval3d(x,y,z,c),如果這還不夠,我會建議(因爲我猜你已經在做)看source code。它不應該是太難以實現什麼最適合您的需求,您可以隨時要求在這裏SO :)

+1

啊哈,那DID有幫助。我所尋找的是[霍納的方法](http://en.wikipedia.org/wiki/Horner's_method)。這個想法是,不是評估1 + x + y + x^2 + y^2 + x y,而是評估1 + y(1 + y)+ x(1 + x + y),這涉及更少的操作。 – marius 2012-04-08 20:22:27

0

功能是在最內層循環,是目前速度 瓶頸。

你可以嘗試完全擺脫循環,通過使用NumPy並用高維數組替換你的變量。

+0

一個好主意,但我不知道x,y等的下一個值......直到我評估函數之後,所以我無法對其進行矢量化。 – marius 2012-04-08 20:17:36