Map
is automatically compiled. Yes, even with RandomChoice
. Try it:
f = Compile[{{p, _Real, 0}, {t, _Integer, 1}},
Map[# RandomChoice[{p, 1 - p} -> {1, 0}] &, t]
];
f // InputForm (* -> clean bytecode *)
Check its performance:
p = 0.1;
t = Table[1, {10^6}];
SeedRandom[1000];
AbsoluteTiming[a = Map[# RandomChoice[{p, 1 - p} -> {1, 0}] &,t];] (* -> 0.578125 seconds *)
AbsoluteTiming[c = f[0.1, t];] (* -> 0.593750 seconds *)
The timings are the same, so this is the solution. It's also the reason that Map
doesn't unpack and MapThread
does. (Compiled code only works with packed arrays.)
MapThread
doesn't have this ability and uses the uncompiled code. Map
will be the same if it is not allowed to compile, as Pickett shows in his answer.
MapThread
unpacks the array... and does more work under the covers (what would you expect re: latter?), and I'd venture compilation (auto) behaves differently. $\endgroup$Map
andMapThread
. Can anyone confirm this?PackArrayQ
returnsFalse
for botha
andb
. $\endgroup$