2010-04-06 59 views
4

我試圖加快一些代碼,然後我試圖編譯一個類和函數使用用Cython故障使用eval()與用Cython

和WOW!我還沒有測量它,但它看起來至少快了10倍。

我剛剛在兩天前看過cython,我印象非常深刻!

但是,我不能讓eval()工作。

def thefirst(int a): 
    d = eval('1+2+a') 
    return d 

我編這module1.pyd文件,並與Python文件調用它:

from module1 import thefirst 
x = thefirst(2) 
print x 

這將返回:

NameError:名字 'A' 沒有定義。

所有幫助表示讚賞。

回答

6

這是因爲eval無法檢查環境以找到a。使用locals函數將它傳遞給環境。

def thefirst(a): 
    return eval('1+2+a', locals()) 
+0

這樣做的竅門,謝謝 – 2010-04-07 00:06:26

-1

嗯,我認爲eval在任何情況下對性能都會相當差。你的實際用例是什麼?

+0

該程序生成隨機表達式,然後選擇其中的健身等於給定的表達式。 (遺傳編程)所以我有像「(2 /((3 *(x + 4)-5)/ 6))」這樣的表達式,有時候是100到150個詞。 Eval()在那裏非常方便。但我是一名初學者,我可以從任何建議中學習。 – 2010-04-07 00:15:07

+0

嗯,我想我應該發佈這個答案作爲評論...哦,現在太晚了:-( – SamB 2015-08-10 17:00:01

3

你可以逃脫cython.inline:

http://wiki.cython.org/enhancements/inline

然而,留意在這種情況下你的Python運行時的內存使用情況。每個編譯和加載的獨特表達式都會佔用一些內存。如果你這麼做的話,這可能會加起來。