Mathematica's pattern matching poorly optimized?

前端 未结 2 1910
失恋的感觉
失恋的感觉 2021-02-13 16:25

I recently inquired about why PatternTest was causing a multitude of needless evaluations: PatternTest not optimized? Leonid replied that it is necessary for what

2条回答
  •  野性不改
    2021-02-13 16:55

    MatchQ unpacks for these kinds of tests. The reason is that no special case for this has been implemented. In principle it could contain anything.

    On["Packing"]
    MatchQ[list, {x_Integer, y__}] // Timing
    
    MatchQ[list, {x__Integer, y__}] // Timing
    

    Improving this is very tricky - if you break the pattern matcher you have a serious problem.

    Edit 1: It is true that the unpacking is not the cause for the O(n^2) complexity. It does, however, show that for the MatchQ[list, {x__Integer, y__}] part the code goes to another part of the algorithm (which needs the lists to be unpacked). Some other things to note: This complexity arises only if both patterns are __ if either one of them is _ the algorithm has a better complexity.

    The algorithm then goes through all n*n potential matches and there seems no early bailout. Presumably because other patters could be constructed that would need this complexity - The issue is that the above pattern forces the matcher to a very general algorithm.

    I then was hoping for MatchQ[list, {Shortest[x__Integer], __}] and friends but to no avail.

    So, my two cents: either use a different pattern (and have On["Packing"] to see if it goes to the general matcher) or do a pre-check DeveloperPackedArrayQ[expr] && Head[expr[[1]]]===Integer or some such.

提交回复
热议问题