微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

最大限度地减少 API 调用次数

如何解决最大限度地减少 API 调用次数

我有三个不同的 API 调用 A、M、T 我有一些规则,我必须按顺序调用这些 API,有时一个 API 调用输出会用作另一个 API 调用的输入。

例如:

规则 1 = M -> A -> A -> M -> T

规则 2 = A -> M -> A -> A -> M -> A -> T

可以组合多个输入并输入到 API 调用以获得多个输出。任何 API 调用的部分输出都可以用作另一个 API 的输入。

因此可以将上述 2 个规则的不同 API 调用数量压缩为

A -> M -> A -> A -> M -> A -> T

减少到总共 7 个 API 调用

我正在寻找的是如果有 n 个规则并且每个规则可以是任何 API 调用序列,那么如何概括这种压缩。 请像任何算法、计算机科学/数学领域那样概括这个问题,引导我朝着正确的方向前进。

解决方法

您可以使用递归生成器函数获取所有重叠组合,并通过max找到最佳结果:

from itertools import zip_longest as zl,product
def combine(rules):
   for i in product(*[enumerate(k) for k in rules]):
      rest = [r[ind+1:] for r,(ind,_) in zip(rules,i)]
      start = [[*filter(None,j)] for j in zl(*[r[:ind] for r,i)])]
      if not any(rest):
         yield start+[[b for _,b in i]]
      else:
          for b in combine(list(filter(None,rest))):
             yield start + [[j for _,j in i]] + b

r1 = 'M -> A -> A -> M -> T'
r2 = 'A -> M -> A -> A -> M -> A -> T'
k = set([tuple(map(tuple,i)) for i in combine([r1.split(' -> '),r2.split(' -> ')])])
print(max(k,key=lambda x:sum(len(set(i)) != len(i) for i in x)))

输出:

(('A',),('M','M'),('A','A'),('T','T')) 

结果输出是两个规则的匹配配对:

A - <no match> => ('A',)
M - M => ('M','M')
A - A => ('A','A')
A - A => ('A','A')
M - M => ('M','M')
A - <no match> => ('A',)
T - T => ('T','T')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。