Warum sind reine Funktionen im Mathematica-Code schneller? [Duplikat]

8

Ich finde oft eine starke Verwendung von reinen Funktionen in vielen der hier geposteten Antworten, und oft sind diese Lösungen viel schneller als benannte Muster usw. Warum ist das so? Warum sind reine Funktionen schneller als andere? Hat es damit zu tun, dass der MMA-Dolmetscher weniger arbeiten muss?

    
Community 13.06.2011, 16:40
quelle

4 Antworten

8

Betrachten wir zunächst einige Beispiel-Benchmarks:

%Vor%

Pure Funktionen sind oft (viel) schneller aus zwei Gründen. Erstens müssen anonyme reine Funktionen (die mit den Slots definiert sind - # und & ) keine Namenskonflikte für Variablennamen auflösen. Daher sind sie etwas schneller als musterdefinierte, wo eine Namenskonfliktauflösung stattfindet. Aber Sie sehen, dass reine Funktionen mit benannten Variablen tatsächlich langsamer sind, nicht schneller als Muster-definierte. Ich kann spekulieren, dass dies auch darauf zurückzuführen ist, dass sie mögliche Konflikte innerhalb ihres Körpers lösen müssen, während regelbasierte Konflikte solche Konflikte ignorieren. In jedem Fall liegen die Geschwindigkeitsunterschiede in der Größenordnung von 10-20%.

Ein anderer und viel dramatischerer Unterschied besteht darin, dass sie in Funktionen wie Map, Scan, Tabelle usw. verwendet werden, da letztere automatisch auf großen numerischen (gepackten) Listen kompiliert werden. Aber während pure Funktionen oft kompiliert werden können, können im Grunde genommen keine patterndefinierten Funktionen erstellt werden, so dass diese Geschwindigkeitsverstärkung für sie nicht zugänglich ist. Zum Beispiel:

%Vor%     
Leonid Shifrin 13.06.2011, 17:48
quelle
0

Pure Funktion hat mehrere Vorteile: - Ergebnis kann zwischengespeichert werden. - Die Berechnung kann sicher paralellisiert werden. - In einigen Fällen kann das Ergebnis zum Zeitpunkt der Kompilierung (CTFE) berechnet werden und die Funktion wird nie am Ende ausgeführt. - Da der äußere Bereich nicht geändert wird, müssen Sie nicht alle Argumente durch Kopieren übergeben.

Wenn also der Compiler die Optimierung relativ zu diesen Funktionen verwalten kann, wird Ihr Programm schneller. Was auch immer die Sprache ist.

    
deadalnix 13.06.2011 16:44
quelle
0

Tatsächlich scheint die Mustererkennung normalerweise schneller zu sein als Function[{u},...] constructions und so schnell wie #& - type constructions (ohne die Möglichkeit der Kompilierung zu berücksichtigen, die in Mma 8 spannender geworden ist).

Um dies zu sehen, definieren Sie eine Funktion, um kurze Teile des Codes zu messen:

%Vor%

versuche es dann:

%Vor%

die geben

%Vor%

Das heißt, Mustererkennung und #& sind schneller als Function . Ich habe keine Ahnung warum.

EDIT: Ich denke, ich hätte die Frage, die belisarius vorher gestellt hat, überprüfen sollen ... Siehe hier für im Wesentlichen die gleiche Antwort wie ich gab, und lesen Sie die Kommentare auch für einige interessante Diskussion.

    
acl 13.06.2011 17:46
quelle
-1

Ja. Es bedeutet, dass es nie viel Zeug kopieren muss, weil eine reine Funktion es nicht ändern kann. Die Listenverarbeitung kann nur eine bestimmte Menge an Kopieren erfordern, aber normalerweise sind die funktionalen Algorithmen so eingerichtet, dass sie effizient sind. Sobald das Material kompiliert ist, wird der imperative Code genauso schnell (fast immer) sein, aber für den interpretierten Mathematica-Bytecode ist pure in der Regel schnell.

    
Nicholas Wilson 13.06.2011 16:44
quelle

Tags und Links