说我有一个函数f
,它在n
个元素的数组上进行迭代,以使用k
条件对其进行过滤。
为了提高可读性,我很想这样写:
result = array
.filter(predicate1)
.filter(predicate2)
.filter(predicate3)
.filter(...)
特别是为了避免不得不写这样的东西:
result = array.filter(e => test1(e) && test2(e) && test3(e) && ...)
当然,上面的内容看起来还可以,但是如果我有多个很难写的测试,最终结果是一团糟的缩进...(请考虑一下)
具有k
个谓词。复杂程度似乎是O(k*n)
,对吧?
如果出现以下情况,会带来哪些性能风险
f
甚至更多次我以filter为例,因为我刚刚面对过它,但是这个问题适用于迭代数组或其他可迭代对象时使用的任何链接方法。
实际上,我真正想知道的是在全球范围内使用这种设计的危险。
当然,在单个功能上不会有太大的问题。我说的是在一个完整的应用程序中的后果,其中每个相似的案例都使用更多的迭代。
答案 0 :(得分:2)
性能风险仅仅是因为执行重复迭代(和/或创建然后回收这些临时数组)而不是单次迭代所花费的时间在您的应用程序中会产生可察觉的延迟,可能仅在功能较低的硬件上。一般建议是:编写清晰,可维护的内容,并在有性能问题时担心性能问题。
从问题中的信息中无法说出您是否会得到答案。您已经说过数组中有“很多”条目,但是“很多”并不能告诉我们太多。 :-)您还说过,每秒将执行几次此处理,这确实建议您最好不要不必要地循环遍历数组并创建中间数组。但是您的里程可能会有所不同。
如果这为您带来很多麻烦,您可以考虑给自己一些实用程序功能,例如:
function multiAndFilter(array, ...filters) {
return array.filter(entry => filters.every(entry));
}
function multiOrFilter(array, ...filters) {
return array.filter(entry => filters.some(entry));
}
...等等,然后:
result = multiAndFilter(array, predicate1, predicate2, predicate3);
答案 1 :(得分:0)
通过对谓词函数采用数组并对其进行迭代,可以保持可读性和可维护性。
然后采用单循环进行拟合。
sympy