2

使用 Cython 标头指令和使用未来导入的正确方法是什么?Python 2.7.x

例子:

1: from __future__ import division
2: #cython: boundscheck=False
3: #cython: wraparound=False
<strike>4: #cython: cdivision=True</strike>
4: #cython: cdivision=False

这可确保除法按预期工作(使用未来版本),但我不确定是否正在遵守指令。将第 1 行与第 4 行交换会导致除法恢复为标准 Python 2.x 方法。

4

1 回答 1

3

正如@user2357112 所评论的那样#cython: cdivision=True矛盾from __future__ import division。这段代码是说明性的:

#cython: wraparound=False
#cython: boundscheck=False
#cython: nonecheck=False
#cython: profile=False
from __future__ import division

def main():
    cdef double i, j
    i = 0
    j = 2
    print 1/j
    print 1/i
    print 1/2

提高:

    print 1/i
ZeroDivisionError: float division

添加#cython: cdivision=True它将给出:

0.5
inf
0

您可以在其中看到1/2正在处理的楼层划分。

在这种情况下,我建议1/2.在使用 Python 2.x 时在任何需要浮点除法的地方应用浮点...

如您所述交换线路:

from __future__ import division
#cython: wraparound=False
#cython: boundscheck=False
#cython: nonecheck=False
#cython: profile=False
#cython: cdivision=True

将取消所有Cython 全局指令,因为它们“必须出现在任何代码之前(但可以出现在其他注释或空格之后)”。

于 2014-05-27T10:38:33.303 回答