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

时间:2016-09-17 10:05:07

标签: python cython

我正在使用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()

我正在对此功能进行cython的原因是为了提高性能。上述功能是一种简化,但基本要素是相同的。请注意,内联函数不使用numpy数组。如果有人能想出更快的方法来评估表达式,我很乐意尝试一下(原始表达式的语法有点不同,但我可以将它编译成任何格式)。

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

更新

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

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为如果你不添加一个返回语句,你就会得到一个本地变量字典。 E.g。

size=100
list_ofList_flows=[parameter_list[i:i+size] for i  in range(0,len(parameter_list), size)]
 #above list_ofList_flows contains [100][100][75] in terms of length

fileNumbers = int(math.ceil((len(parameter_list) / 100)))
#fileNumbers is 3, because we have 3 sets of lists[100, 100, 75]

i = 0
while i < fileNumbers:

    for flowGroup in list_ofList_flows:
        f = open("workFlow_sheet" + str(i) + ".txt", "w")

        for flo in flowGroup:
            f.write(flo + '\n')



    i = i + 1

会返回cython.inline('''x = a*b y = b+c z = a-c ''', a=1, b=2, c=3) xy字典。显然它有点不必要,因为你可以自己手动完成,但它会使一些用例容易(并且如果删除则会破坏与现有代码的兼容性)。

Cython通过将z添加到它编译的所有内容的末尾来完成这些功能。您可以在source code

中找到它

我不认为你可以摆脱它,但它也没有任何成本(除了编译器警告) - C编译器很明显代码是无法访问的,因此它永远不会生成

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