Python 将eval()与cython一起使用时出现问题

Python 将eval()与cython一起使用时出现问题,python,cython,Python,Cython,我试图加速一些代码,然后我尝试使用cython编译一个类和一个函数 哇!我还没有测量过,但看起来至少快了10倍 两天前我第一次看cython,我印象深刻 但是,我无法让eval()工作 我将其编译为module1.pyd文件,并使用python文件调用它: from module1 import thefirst x = thefirst(2) print x 这将返回: NameError:未定义名称“a” 感谢所有帮助。这是因为eval无法检查环境以找到a。使用locals函数将其传递给环

我试图加速一些代码,然后我尝试使用cython编译一个类和一个函数

哇!我还没有测量过,但看起来至少快了10倍

两天前我第一次看cython,我印象深刻

但是,我无法让eval()工作

我将其编译为module1.pyd文件,并使用python文件调用它:

from module1 import thefirst
x = thefirst(2)
print x
这将返回:

NameError:未定义名称“a”


感谢所有帮助。

这是因为
eval
无法检查环境以找到
a
。使用
locals
函数将其传递给环境

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

嗯,我认为eval在任何情况下都会对性能造成相当大的影响。您的实际用例是什么?

您可以使用cython.inline:


但是,在本例中,请注意Python运行时的内存使用情况。编译和加载的每个不同表达式都会占用一些内存。如果您经常这样做,这可能会累加。

程序会生成随机表达式,然后在其中进行选择,以适应与给定表达式相等的情况。(遗传编程)所以我有类似于“(2/((3*(x+4)-5)/6))的表达式,有时长100到150个术语。Eval()在那里非常方便。但是我是一个初学者,我可以从任何建议中学习。嗯,我想我应该把这个答案作为评论发布。。。哦,现在太晚了:-(
def thefirst(a):
    return eval('1+2+a', locals())