使用cython.inline时无法访问的代码

橙子

我正在使用Cython将函数编译为C,但是收到“无法访问的代码”警告。当我检查pyx文件时,我看到一个附加文件,return locals()但我不太了解它是如何到达那里的。

该代码由生成cython.inline

cython.inline('return a * b + c if a > b else 0.0', a=1, b=2, c=3)

生成一个如下所示的pyx文件:

def __invoke(double a, double b, double c):
    return a * b + c if a > b^2 else 0.0
    return locals()

我对这个功能进行了cythonize的原因是为了提高性能。上面的功能是一个简化,但是基本元素是相同的。请注意,内联函数未使用numpy数组。如果有人可以想到一种更快的方式来评估表达式,我很乐意尝试一下(原始表达式的语法有些不同,但是我可以将其编译为任何格式)。

无论如何,这个问题的重点是要理解为什么添加了附加return语句以及如何将其删除。

更新

这是我从cython.inline呼叫中注意到的开销(指的是与@DavidW的对话)。

在此处输入图片说明

戴维

我认为是这样,如果您不添加return语句,则可以获取局部变量字典。例如

cython.inline('''x = a*b
y = b+c
z = a-c
''', a=1, b=2, c=3)

会退给你的字典xyz显然,这是不必要的,因为您可以自己手动进行操作,但是这使某些用例变得容易(如果删除,则会破坏与现有代码的兼容性)。

Cython通过将return locals()其编译的所有内容添加到末尾来实现这些功能您可以在源代码中找到它

我认为您无法摆脱它,但是它也不花任何钱(除了编译器警告)-对于C编译器来说很明显,代码不可访问,因此永远不会生成。


要回答有关提高性能的第二个问题-这种计算大概仅在被重复调用时才重要吗?如果可能的话,我也会尝试在Cython中获得循环,否则,如果您获得了很多,我会感到惊讶。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章