1
$\begingroup$

I make a function like this

LookupOptionFunction[option_] := 
 Select[Select[Names["System`*"], StringFreeQ[#1, "$"] &], 
  KeyExistsQ[Options[ToExpression[#1]], option] &]

Its can help uw select some function contain a certain option.But when I start the Mathematica and first time to use it,it will be very very slow like

LookupOptionFunction[SameTest] // AbsoluteTiming

{58.6652,{AntihermitianMatrixQ,AntisymmetricMatrixQ,Complement,ContainsAll,ContainsAny,ContainsExactly,ContainsNone,ContainsOnly,Entropy,FindTransientRepeat,FixedPoint,FixedPointList,HermitianMatrixQ,Intersection,KeyComplement,NormalMatrixQ,OrthogonalMatrixQ,SymmetricMatrixQ,TestReport,Union,UnitaryMatrixQ,VerificationTest}}

I Can't Stand it cost my almost 1 minute. but when we run it second time or afterwards.It will very speed.

LookupOptionFunction[SameTest] // AbsoluteTiming

{0.520688,{AntihermitianMatrixQ,AntisymmetricMatrixQ,Complement,ContainsAll,ContainsAny,ContainsExactly,ContainsNone,ContainsOnly,Entropy,FindTransientRepeat,FixedPoint,FixedPointList,HermitianMatrixQ,Intersection,KeyComplement,NormalMatrixQ,OrthogonalMatrixQ,SymmetricMatrixQ,TestReport,Union,UnitaryMatrixQ,VerificationTest}}

It is not enough one second.What something I have meet?Or any method can do this thing?


I'm use it in 10.4 and 10.3.1 will be in a same situation.

$\endgroup$
  • $\begingroup$ I just ran your code on 10.4 (which I think you did as well) and I'm not seeing the speed-up at all. The first run was 70 seconds, the second 64. And I'm also getting "iteration limit exceeded" message (although the result seems correct). $\endgroup$ – Martin Ender Mar 23 '16 at 12:43
  • $\begingroup$ @MartinBüttner I have update my condition.Sounds your situation is worse than me.:) $\endgroup$ – yode Mar 23 '16 at 12:47
4
$\begingroup$
$Version

(*  "10.4.0 for Mac OS X x86 (64-bit) (February 26, 2016)"  *)

The iterations are using most of the time. Set a lower \$IterationLimit (lowest allowable value is 20).

lookupOptionFunction[option_] := Block[{$IterationLimit = 20},
      Select[Names["System`*"], 
       StringFreeQ[#1, "$"] && KeyExistsQ[Options[ToExpression[#1]], option] &]]

lookupOptionFunction[SameTest] // AbsoluteTiming

(*  $IterationLimit::itlim: Iteration limit of 20 exceeded. >>

{8.42141, {"AntihermitianMatrixQ", "AntisymmetricMatrixQ", "Complement", 
  "ContainsAll", "ContainsAny", "ContainsExactly", "ContainsNone", 
  "ContainsOnly", "Entropy", "FindTransientRepeat", "FixedPoint", 
  "FixedPointList", "HermitianMatrixQ", "Intersection", "KeyComplement", 
  "NormalMatrixQ", "OrthogonalMatrixQ", "SymmetricMatrixQ", "TestReport", 
  "Union", "UnitaryMatrixQ", "VerificationTest"}}  *)

The second call is faster presumably because of some caching.

lookupOptionFunction[SameTest] // AbsoluteTiming

(*  $IterationLimit::itlim: Iteration limit of 20 exceeded. >>

{0.548943, {"AntihermitianMatrixQ", "AntisymmetricMatrixQ", "Complement", 
  "ContainsAll", "ContainsAny", "ContainsExactly", "ContainsNone", 
  "ContainsOnly", "Entropy", "FindTransientRepeat", "FixedPoint", 
  "FixedPointList", "HermitianMatrixQ", "Intersection", "KeyComplement", 
  "NormalMatrixQ", "OrthogonalMatrixQ", "SymmetricMatrixQ", "TestReport", 
  "Union", "UnitaryMatrixQ", "VerificationTest"}}  *)

To identify which symbol is exceeding the iteration limit:

lookupOptionFunction2[option_] := Block[{$IterationLimit = 20},
      Select[Names["System`*"], 
       Check[StringFreeQ[#1, "$"] && 
      KeyExistsQ[Options[ToExpression[#1]], option], 
     Print[StringForm["`` exceeded iteration limit", #1]]] &]]

lookupOptionFunction2[SameTest] // AbsoluteTiming

(* $IterationLimit::itlim: Iteration limit of 20 exceeded. >>

AllowTransliteration exceeded iteration limit

{0.559639, {"AntihermitianMatrixQ", "AntisymmetricMatrixQ", 
  "Complement", "ContainsAll", "ContainsAny", "ContainsExactly", 
  "ContainsNone", "ContainsOnly", "Entropy", "FindTransientRepeat", 
  "FixedPoint", "FixedPointList", "HermitianMatrixQ", "Intersection", 
  "KeyComplement", "NormalMatrixQ", "OrthogonalMatrixQ", 
  "SymmetricMatrixQ", "TestReport", "Union", "UnitaryMatrixQ", 
  "VerificationTest"}}  *)

Options[AllowTransliteration] // AbsoluteTiming

(*  $IterationLimit::itlim: Iteration limit of 4096 exceeded. >>

{77.3179, {}}  *)

This exceeds the iteration limit even though it has no options.

| improve this answer | |
$\endgroup$
  • $\begingroup$ Can we found which function result the $IterationLimit surpass 20? $\endgroup$ – yode Mar 23 '16 at 13:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.