Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

07 Jun '16, 11:07

Henri's gravatar image

Henri
15.7k133943

Der TeX-Interpreter hat intern Hash-Tables, die er für den Lookup von definierten Makros benutzt. Daher halte ich es für klug für jeden Eintrag in der Liste ein Makros zu definieren und beim holen des Werts zu prüfen, ob das Makro existiert. existiert. (Der ganze Spaß geht sogar [ohne e-TeX-Extensions](http://hastebin.com/yonaxojewo.tex)) Die Performance habe ich evaluiert, indem ich eine Liste angelegt habe in der Key=Value ist (zwar nutzlos, aber ein einfaches Beispiel). \documentclass{article} \usepackage{xparse} \ExplSyntaxOn \int_step_inline:nnnn { 1 } { 1 } { 5000 } { \cs_new:cpn { lookup_table_#1 } { #1 } } \NewDocumentCommand \Wertsuche {m} { #1:~ \cs_if_exist:cTF { lookup_table_#1 } { \use:c { lookup_table_#1 } } { kein~Wert } } \ExplSyntaxOff \begin{document} \Wertsuche{500} \end{document} Der LaTeX-Aufruf dauert $ time pdflatex test.tex real 0m0.321s user 0m0.300s sys 0m0.016s Dasselbe mit Clemens' Lösung: \documentclass{article} \usepackage{expl3,xparse} \ExplSyntaxOn \tl_new:N \l_meinmodul_tmpa_tl \prop_new:N \l_meinmodul_liste_prop \int_step_inline:nnnn { 1 } { 1 } { 5000 } { \prop_put:Nnn \l_meinmodul_liste_prop { #1 } { #1 } } \cs_new_protected:Npn \meinmodul_wertsuche:n #1 { \prop_get:NnNTF \l_meinmodul_liste_prop {#1} \l_meinmodul_tmpa_tl { \tl_use:N \l_meinmodul_tmpa_tl } {kein~ Wert} } \NewDocumentCommand \Wertsuche {m} { #1:~ \meinmodul_wertsuche:n {#1} } \ExplSyntaxOff \begin{document} \Wertsuche{500} \end{document} Hier dauert es $ time pdflatex test.tex real 0m5.964s user 0m5.920s sys 0m0.016s
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

07 Jun '16, 10:52

Henri's gravatar image

Henri
15.7k133943

Der TeX-Interpreter hat intern Hash-Tables, die er für den Lookup von definierten Makros benutzt. Daher halte ich es für klug für jeden Eintrag in der Liste ein Makros zu definieren und beim holen des Werts zu prüfen, ob das Makro existiert. Die Performance habe ich evaluiert, indem ich eine Liste angelegt habe in der Key=Value ist (zwar nutzlos, aber ein einfaches Beispiel). \documentclass{article} \usepackage{xparse} \ExplSyntaxOn \int_step_inline:nnnn { 1 } { 1 } { 5000 } { \cs_new:cpn { lookup_table_#1 } { #1 } } \NewDocumentCommand \Wertsuche {m} { #1:~ \cs_if_exist:cTF { lookup_table_#1 } { \use:c { lookup_table_#1 } } { kein~Wert } } \ExplSyntaxOff \begin{document} \Wertsuche{500} \end{document} Der LaTeX-Aufruf dauert $ time pdflatex test.tex real 0m0.321s user 0m0.300s sys 0m0.016s Dasselbe mit Clemens' Lösung: \documentclass{article} \usepackage{expl3,xparse} \ExplSyntaxOn \tl_new:N \l_meinmodul_tmpa_tl \prop_new:N \l_meinmodul_liste_prop \int_step_inline:nnnn { 1 } { 1 } { 5000 } { \prop_put:Nnn \l_meinmodul_liste_prop { #1 } { #1 } } \cs_new_protected:Npn \meinmodul_wertsuche:n #1 { \prop_get:NnNTF \l_meinmodul_liste_prop {#1} \l_meinmodul_tmpa_tl { \tl_use:N \l_meinmodul_tmpa_tl } {kein~ Wert} } \NewDocumentCommand \Wertsuche {m} { #1:~ \meinmodul_wertsuche:n {#1} } \ExplSyntaxOff \begin{document} \Wertsuche{500} \end{document} Hier dauert es $ time pdflatex test.tex real 0m5.964s user 0m5.920s sys 0m0.016s