9 python optimization numpy cython scipy
我正在逐个元素地构建一个带有cython元素的数组.我想将常量np.inf
(或-1 * np.inf
)存储在某些条目中.但是,这需要回到Python查找的开销inf
.有libc.math
这个常数的等价物吗?或者其他一些可以轻松使用的值,可以在(-1*np.inf)
没有开销的情况下从Cython中使用并且可以使用它们?
编辑示例,你有:
cdef double value = 0
for k in xrange(...):
# use -inf here -- how to avoid referring to np.inf and calling back to python?
value = -1 * np.inf
Run Code Online (Sandbox Code Playgroud)
Cai*_*von 15
它没有文字,但float
可以从字符串中解析它:
>>> float('inf')
inf
>>> np.inf == float('inf')
True
Run Code Online (Sandbox Code Playgroud)
或者,math.h
可以(几乎肯定会)声明一个评估为inf的宏,在这种情况下你可以使用它:
cdef extern from "math.h":
float INFINITY
Run Code Online (Sandbox Code Playgroud)
(没有干净的方法来检查INFINITY是否在纯Cython中定义,所以如果你想覆盖所有基础,你需要得到hacky.一种方法是创建一个小的C头,比如说fallbackinf.h
:
#ifndef INFINITY
#define INFINITY 0
#endif
Run Code Online (Sandbox Code Playgroud)
然后在.pyx文件中:
cdef extern from "math.h":
float INFINITY
cdef extern from "fallbackinf.h":
pass
inf = INFINITY if INFINITY != 0 else float('inf')
Run Code Online (Sandbox Code Playgroud)
(你不能分配给INFINITY,因为它是一个右值.如果在标题中#defined INFINITY为1.0/0.0,你就可以取消三元运算符,但这可能会引发SIGFPE,具体取决于你的编译器.)
尽管如此,这绝对是货物崇拜优化的范畴.)
小智 14
在Cython中这样做的推荐方法是:
from numpy.math cimport INFINITY
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个"cimport"而不是常规导入.这是Cython围绕NumPy的官方包装npymath
.
归档时间: |
|
查看次数: |
22488 次 |
最近记录: |