【发布时间】:2014-04-01 07:30:19
【问题描述】:
我正在尝试将本机 python 函数的一部分转换为 cython 以缩短计算时间。我想为占用时间的循环组件编写一个 cython 函数(正如 ipython lprun 好心告诉我的那样)。然而,这个函数接受可变大小的矩阵..我看不出如何轻松地将它带到静态类型的 cython。
for index1 in range(0,num_products):
for index2 in range(0,num_products):
cond_prob = (data[index1] * data[index2]).sum() / max(col_sums[index1], col_sums[index2])
prox[index1][index2] = cond_prob
这个问题是 num_products 每年都在变化,因此矩阵(数据)大小是可变的。
这里最好的策略是什么?
- 我应该写两个 C 函数吗?一个使用 memalloc 创建一个特定维度的矩阵,然后一个对创建的矩阵进行循环?
- 在这种情况下是否有一些花哨的 cython/numpy 魔法可以提供帮助?我可以编写一个 C 函数,在内存中接收可变大小的 Numpy 数组并传递大小吗?
【问题讨论】:
-
您好,在 cython 中,您也可以执行 num_products = data.shape[0] 或类似的操作,以便您的循环长度适合您。但是,我不太确定您将要改进循环的方式是否会有很大帮助,因为您在 cython 循环中使用了 numpy 函数。您正在尝试做的事情在 numpy 中似乎也非常简单......上面的表达式是您的原始 python 代码吗?因为如果是这样,您可以通过省略 for 循环来优化它,从而使其更快。
-
几个问题:数组
data和prox的shape是什么?它们都是numpy数组吗?num_products通常有多大? -
感谢 cmets。好点re:矢量化而不是循环遍历numpy数组!数据 = (170 x 800),因此 prox 为 800 x 800