2012-08-13 24 views
2

我是python的新手,並且努力讓cython加速我的一些計算。我儘可能地嘗試了我所能想到的,但似乎我還沒有理解某些東西,所以我對此感到悲傷。我有這些文件: 第一個叫Myfunc.pyx在cython中定義和使用數學函數

import math 
from sympy import Symbol 
x = Symbol('x') 


wi=10 

cdef float MyList(float a,float b): 
    return [(xa,ya,wi+a.subs(x,xa)*math.sin(xa)*b.subs(x,xa)*math.exp(1/ya**2)) for xa in range(1,5001,10) for ya in range(-2501,2501,10)] 

setup.py

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

ext_modules=[ 
    Extension("Myfunc", 
       ["Myfunc.pyx"], 
       libraries=["m"]) # Unix-like specific 
] 

setup(
    name = "Demos", 
    cmdclass = {"build_ext": build_ext}, 
    ext_modules = ext_modules 
) 

終於撥通calc.py的Python腳本,我運行以獲取列表我想,所謂的 「MyList1」:

import Myfunc 
from sympy import Symbol 
import math 

x = Symbol('x') 


a1=(10*x)**(0.5) 
b1=(20*x)**(0.5) 
wi=10 


MyList1=Myfunc.MyList(a1,b1) 
print MyList1 

現在一些澄清: 1)x,y是在先前的腳本中使用純粹作爲符號來推導公式。我使用a.subs(x,xa)b.subs(x,xa)(請參閱第一個文件Myfunc.pyx)來刪除x並將其替換爲xa以最終得到數字而不是符號解決方案。 2)我認爲在第三個文件(calc.py)的頂部,我不應該使用import Myfunc,但其他的東西我不明白。 我想我應該這樣做:運行setup.py,然後因爲有2個新文件創建了Myfunc.c和Myfunc.so我只是運行calc.py文件,據說我會讓我的數字更快tahn純python。 必須做什麼:我終於不知道... 我想如果可能的話:exp()a.subs(x,xa)b.subs(x,xa)我認爲正在放慢我的計算。我嘗試將這段代碼從純python轉換爲「cython」(我認爲轉換不是一個好詞來描述這一點)。官方網站上的教程對我來說有點難以理解,所以我總是無法實現這一點。請原諒我的英語,因爲我的氣墊船充滿了鰻魚

+0

正如你在Python新。檢查pylint或pep8來檢查你的代碼,並建議一些樣式變化,如pep8中所建立的。 – 2012-08-13 22:39:46

回答

3

sympy與cython無法結合。通過將cdef類和聲明的變量轉換爲C並編譯它,Cython加速了python。 sympy.Symbol或任何其他sympy函數沒有C++的等價物,因此它不能編譯成C語言,因此沒有加速。

更具體地說。當您聲明afloat a時,它是C double而不是sympy類型。因此它沒有.subs方法。 (和它不能)

如果我明白你在numpy上工作的是比cython更好的解決方案。基本上numpy.arrays是C數據類型。當你用它們進行計算時,它發生在C++速度上。它記錄瞭如何與sympy一起使用numpy。如果由於某種原因,你無法實現你打算用numpy(不太可能)numpy仍然適用於cython。

+0

我想你是對的......它只是默認爲python,當它遇到'subs',但不會產生任何形式的警告。我想我必須先優化我的Python代碼,然後看看還有什麼可以做的...謝謝。 – CosmoSurreal 2012-08-15 22:58:40

+1

你很好,你可能也會投票給我嗎?你可以使用cdef函數:'cdef a1(x):(10 * x)**(0.5)',而不是使用sympy替換。你可以用cython重寫你的代碼,而不需要sympy。 – 2012-08-16 15:39:09

+0

當然,您可以將SymPy與Cython結合使用,但不能直接使用它們:它們在SymEngine中使用Cython(其類可以導入到SymPy中,甚至可以覆蓋SymPy的類)。 – rwst 2015-11-02 10:07:44

3

有很多方法可以從SymPy中的符號表達式開始,並以快速數字代碼結束。

  • 你可以看看SymPy的代碼生成

  • 你可以看着lamdify功能