【发布时间】:2022-02-09 02:18:05
【问题描述】:
我正在尝试学习 cython,我使用 annotate=True 编译。
在The basic manual 中表示:
如果一行是白色的,则表示生成的代码不与 Python 交互,因此运行速度与普通 C 代码一样快。黄色越深,该行中的 Python 交互越多
然后我按照(据我所知)numpy in cython basic manual 说明编写了这段代码:
+14: cdef entropy(counts):
15: '''
16: INPUT: pandas table with counts as obsN
17: OUTPUT: general entropy
18: '''
+19: cdef int l = counts.shape[0]
+20: cdef np.ndarray probs = np.zeros(l, dtype=np.float)
+21: cdef int totals = np.sum(counts)
+22: probs = counts/totals
+23: cdef np.ndarray plogp = np.zeros(l, dtype=np.float)
+24: plogp = ( probs.T * (np.log(probs)) ).T
+25: cdef float d = np.exp(-1 * np.sum(plogp))
+26: cdef float relative_d = d / probs.shape[0]
27:
+28: return {'d':d,
+29: 'relative_d':relative_d
30: }
在 cython.debug.output.html 文件中,行首的所有 "+" 都是黄色的。
我做错了什么?我怎样才能使这个函数的至少一部分以 c 速度运行? 该函数返回一个 python 字典,因此我认为我不能返回任何 c 数据类型。我在这里可能错了。
感谢您的帮助!
【问题讨论】:
-
我将不得不详细研究它,但它是很好的学习材料。谢谢@ead!!