我正在使用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的对话)。
答案 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)
,x
和y
字典。显然它有点不必要,因为你可以自己手动完成,但它会使一些用例容易(并且如果删除则会破坏与现有代码的兼容性)。
Cython通过将z
添加到它编译的所有内容的末尾来完成这些功能。您可以在source code。
我不认为你可以摆脱它,但它也没有任何成本(除了编译器警告) - C编译器很明显代码是无法访问的,因此它永远不会生成
要回答关于提高绩效的第二个问题 - 这种计算大概只有在重复调用时才有意义吗?如果可能的话,我也会尝试在Cython中获得循环,否则如果你获得了很多,我会感到惊讶。