I am not looking for a solution or work-around, but an explanation.
Here are six examples of doing a trivial operation on an association and a list.
Initially, I was curious about the cost of calling a function for which the matched pattern is a large association:
rAssoc = AssociationMap[RandomReal[{0, #}] &, Range[10^7]];
fA[r_] := Total[r]
gA[] := Total[rAssoc]
AbsoluteTiming[fA[rAssoc];] (*about 3.38 seconds*)
AbsoluteTiming[gA[];] (*slightly longer 3.42, expense of passing association not large*)
What about doing the same thing for a list:
rList = RandomReal[{0, #}] & /@ Range[10^7];
fL[r_] := Total[r]
gL[] := Total[rList]
AbsoluteTiming[fL[rList];] (*about .005 seconds*)
AbsoluteTiming[gL[];] (*about .007 seconds*)
The list is much much faster. Why?
There is some discussion in this April 2018 StackExchange:
Let's and see if the same holds for an unpacked array:
Needs["Developer`"]
PackedArrayQ[rList] (*True*)
AbsoluteTiming[rListUnpacked = FromPackedArray[rList];] (*0.13 seconds*)
fLU[r_] := Total[r]
gLU[] := Total[rListUnpacked]
AbsoluteTiming[fL[rListUnpacked];] (*0.57 seconds*)
AbsoluteTiming[gLU[];] (*0.58 seconds*)
It appears that the culprit may be Values:
AbsoluteTiming[Values[rAssoc];] (*3.37 seconds*)
I am curious why extracting the values for the Association is slower.