Cython头指令和__future__

时间:2014-01-25 20:56:24

标签: python python-2.7 cython integer-division floor

使用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方法。

1 个答案:

答案 0 :(得分: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被处理为分区。

在这种情况下,我建议在使用Python 2.x时将浮点1/2.应用于浮点除法......

如上所述交换行:

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

将取消所有the Cython global directives,因为它们“必须出现在任何代码之前(但可以出现在其他评论或空白之后)”。