gpt4 book ai didi

python - Cython 浮点除法 PyExc_ZeroDivision 错误检查

转载 作者:太空狗 更新时间:2023-10-29 20:13:10 28 4
gpt4 key购买 nike

我正在进行一些循环密集型计算并将代码转换为 Cython。我使用 cython -a 选项进行了分析,并检查了 .html 文件,似乎每当我进行浮点除法时,都会出现一些黄线,并且它会执行如下操作:

if (unlikely(__pyx_t_37 == 0)) {
PyErr_Format(PyExc_ZeroDivisionError, "float division");
{__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
}

我想这是针对分频器为 0 的情况。我为此使用了一个常量,分频器不可能为 0,我想知道是否有什么办法可以让它更快。

最佳答案

您需要添加@cython.cdivision(True) 以避免异常检查。

import cython

cdef double pydivision():
cdef int i
cdef double k, j
k = 2.0
j = 0.0
for i in range(10):
j += i/k
# Generated code: Python exception checking
# /* "checksum.pyx":9
# * j = 0.0
# * for i in range(10):
# * j += i/k # <<<<<<<<<<<<<<
# * return j
# *
# */
# if (unlikely(__pyx_v_k == 0)) {
# PyErr_Format(PyExc_ZeroDivisionError, "float division");
# {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
# }
# __pyx_v_j = (__pyx_v_j + (__pyx_v_i / __pyx_v_k));
# }
return j

#This decorator works wonders
@cython.cdivision(True)
cdef double cdivision():
cdef int i
cdef double k, j
k = 2.0
j = 0.0
for i in range(10):
j += i/k
# Generated code: no exception checking
# /* "checksum.pyx":20
# * j = 0.0
# * for i in range(10):
# * j += i/k # <<<<<<<<<<<<<<
# * return j
# *
# */
# __pyx_v_j = (__pyx_v_j + (__pyx_v_i / __pyx_v_k));
# }
return j

关于python - Cython 浮点除法 PyExc_ZeroDivision 错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709285/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com