我的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
中的每个值乘以id
中weights
的对应值然后将结果汇总到最终的dict,其键是items
中的值。
为了更好地说明,我尝试在Cython中实现它:
对于每个字典,我会将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代码更快?