Cythonize函数如何输入作为Dicts列表

时间:2017-12-03 03:08:49

标签: python cython

我的Python输入类似于:

inters = [{"id": "sku0", "items": ["sku0", "sku1"], "scores": [0.9, 0.3]},
          {"id": "sku1", "items": ["sku0", "sku2", "sku3"], "scores": [0.1, 0.8, 0.2]}, ...]

有权重的词典:

weights = {"sku0": 0.5, "sku1": 2., (...)}

我正在寻找一种方法来对以下操作进行cython化:对于inters中的每个字典,将scores中的每个值乘以idweights的对应值然后将结果汇总到最终的dict,其键是items中的值。

为了更好地说明,我尝试在Cython中实现它:

enter image description here

对于每个字典,我会将scores中的每个值乘以scores[id]并添加到最终res字典。

这使得代码 7x 比原始Python实现更快(实现如下):

from collections import Counter
def make_recos(inters, scores):                                               
    r = sum([Counter({e['items'][i]: e['scores'][i] * scores[e['id']] for i in range(len(e['items']))}) for e in inters], Counter())     

我们仍然需要它更快。从Cython注释所说的,仍然有很多Python-API调用(特别是行14),我不知道如何避免这样做,因为字典键内的值不是C结构而是Python对象。

有没有办法在每个dict中使这些值成为C结构,以避免Python调用?或者可能还有其他策略可以让Cython代码更快?

0 个答案:

没有答案