请问这个函数可以优化吗?
mathematica吧
全部回复
仅看楼主
level 5
PikingDistance[list_] :=
Total[Table[
Max[Table[
SequencePosition[
PData[[m]][[list]], {Data4[[Result[[m]]]][[x]][[n]]}][[1,
1]], {n, 1, Length[Data4[[Result[[m]]]][[x]]]}]] -
Min[Table[
SequencePosition[
PData[[m]][[list]], {Data4[[Result[[m]]]][[x]][[n]]}][[1,
1]], {n, 1, Length[Data4[[Result[[m]]]][[x]]]}]], {x, 1,
Length[Result[[m]]]}]]
这是我自己定义的一个函数,Data4,PData,Result都是一些数据集(比较大),这个函数实现起来非常低效,对于每个自变量来说要运行0.047s之多
2022年07月23日 09点07分 1
吧务
level 10
要不你先给个简单的数据样本?
2022年07月24日 15点07分 2
优化我看多半是可以的。
2022年07月24日 15点07分
链接:网页链接 提取码:pg7p
2022年07月24日 23点07分
m是一个1-39 的数字
2022年07月24日 23点07分
@asdasd1dsadsa list是一个1-200的排序
2022年07月24日 23点07分
吧务
level 10
With[{PDpermutated = pd[[list]]}, Table[
MinMax@Table[
SequencePosition[
PDpermutated,
{data4n}
, 1][[1,1]]
, {data4n, Data4[[resx]]}]
, {resx, res}] . {-1,1} //Total]
2022年07月25日 13点07分 4
吧务
level 10
代码发了,过会儿你应该就能看到。
对你的数据样例是2.41倍速度。
2022年07月25日 13点07分 5
可以讲一下优化原理吗
2022年07月25日 13点07分
代码至今没显示出来,估计是没戏了,仅我自己可见
2022年07月27日 10点07分
其实可以发图的,我手打就是了
2022年07月27日 11点07分
吧务
level 10
主要的开销就是索引和模式匹配。
序列匹配我们优化不了多少,但至少用它的第三参数来尽早停止匹配。
索引的话,你这里基本上所有的Table都是用于1到Length的Part,那么和完全可以被更高效的Table第五用法或Map取代。
然后计算极差时要尽量避免匹配两次,最少也要用With存住匹配结果,不要算两次。我这里直接用MinMax同时取得最值,求差则用内积来算。
再就是PData的置换在Table里会被多次重复计算,这里我直接With存起来。
2022年07月25日 13点07分 6
好的谢谢
2022年07月25日 14点07分
吧务
level 12
提速大概2个数量级的解法
PikingDistance2[list_] := Module[{asso},
asso = AssociationThread[PData[[m]][[list]] -> Range[Length@list]];
Map[{-1, 1}.MinMax[asso /@ #] &, Data4[[Result[[m]]]], {1}] // Total
]
代码里最慢的部分就是SequencePosition,仔细观察发现这里只需要每个元素的位置,且PData各元素均无重复,所以可以直接生成一个元素岛位置的字典(即mma里Association),以O(1)的复杂度做查询。剩下的部分用Map简写下就行
2022年07月25日 14点07分 7
吧务
level 12
有代码的层被抽了,只发截图试试能不能过
代码里最慢的部分就是SequencePosition,仔细观察发现这里只需要每个元素的位置,且PData各元素均无重复,所以可以直接生成一个元素到位置的字典(即mma里Association),以O(1)的复杂度做查询。剩下的部分用Map简写下就行
提速大概2个数量级
2022年07月25日 14点07分 8
厉害👍
2022年07月25日 15点07分
1