Hier ist ein ganz anderer Vorschlag - ich versuchte es tatsächlich besser zu machen, anstatt besser lesbar zu sein. Das Problem mit Ihrem aktuellen Code ist, dass es summiert viele Zahlen immer wieder, wenn nicht wirklich benötigt. Vergleich der beiden Ansätze nach dem Implementierungscode. Im nur summieren ein Haufen zum ersten Mal, und dann subtrahieren den Schwanz und Hinzufügen des Kopfes, immer wieder: Und hier sind die Geschwindigkeitstests, Vergleich der Full-Rekalkulation Ansatz gegenüber diesem: Da Foo1 ist O (nm) und Foo2 ist O (nm) seine wirklich nicht überraschend, dass der Unterschied ist riesig. Ergebnisse auf dieser nicht wirklich verrückt großen Skala sind: Ergebnisse sind gleich: True Foo1: 5,52 Sekunden Foo2: 61,1 Millisekunden Und in einem größeren Maßstab (ersetzt 1000 mit 10000 auf beiden Iterationen und zählen): Foo1: Stopped nach 10 Minuten. Foo2: 6.9 Sekunden Vorhin schrieb ich über die Berechnung der gleitenden Durchschnitt von Live-Daten mit der Buffer () - Methode in Reactive Extensions. Die Methode erstellt einen Puffer von Updates, deren Grenze Sie, wie der Entwickler spezifiziert, und stellt Ihnen diesen laufenden Puffer mit jeder nachfolgenden Aktualisierung zur Verfügung. Das Update 8216current8217 wäre letzter im Puffer, der es erlaubt, den inklusiven gleitenden Durchschnitt zu berechnen, wobei der letzte Faktor in den Ergebnissen enthalten ist. Vor kurzem hatte ich etwas Ähnliches mit statischen Daten in einer Anwendung, die nicht mit RX zu tun hatte, hatte bud einen gut definierten LINQ-basierten Daten-Provider zu tun. Zu meiner Überraschung, fand ich, dass LINQ nicht eine Pufferung Methode aus der Box. Zu meiner größeren Überraschung fand ich, dass es einfach war, eine zu implementieren. Der Code ist unten. Ich wollte nicht annehmen, dass wir nur durchschnittliche Aggregationen durchführen würden, daher halte ich meine Lösung ziemlich generisch. Es wäre Aufgabe des Benutzers meiner Funktion, die Aggregationslogik zu codieren. In diesem Beitrag würde ich zeigen, durchschnittliche Aggregationen, aber der Benutzer dieser Funktion wäre in der Lage, alles mit einem bestimmten Satz von Elementen zu tun. Zuerst definieren let8217s eine Datenstruktur, die Aggregation genannt wird, die verwendet werden würde, um das Original zu wickeln und eine neue AggregatedValue-Eigenschaft (Zeile 16) hinzuzufügen, die wir während des Aggregationsprozesses auffüllen würden. Dann definiere ich ein Beispiel TimedDataPoint, die verwendet werden würde, um Aktienkurse in meinem Beispiel zu halten. Schließlich definieren let8217s eine LINQ-Funktion, die einen Satz von Elementen im ursprünglichen Satz puffern würde und einen modifizierten Satz mit weniger Elementen zurückgeben würde, wobei jedes Element einen Aggregationswert für den gepufferten Satz enthalten würde. Um Erfolg geltend zu machen, muss ich die Funktion testen. Um mit echten Zahlen spielen, let8217s erhalten die Geschichte der wöchentlichen MSFT Aktienrenditen von Yahoo. Let8217s exportieren diese Daten zu excel und erstellen Satz von gleitenden Durchschnitten von Close Preis, um unsere Daten zu testen. Hier ist das, was die Tabelle aussehen sollte: Wir können dann ein Beispiel-Dataset erstellen, um die ursprünglichen Schlusskurse darzustellen. Wir können dann unsere Funktion testen, indem ich eine gleitende Durchschnittsberechnung auf dem Dataset erstellt. Der Code ist unten. Zuerst erstelle ich den Datensatz, dann iteriere ich durch den Dataset, führe die Daten in meine Aggregator-Funktion, die wiederum ruft mich zurück und fragt mich, 2 wichtige Entscheidungen zu treffen: 1. Sollte es weiter Pufferung (Zeilen 60 und 71) 2 (Zeile 61 in dem ersten Beispiel und Zeile 74-82 in der zweiten) Die Ausgabe des Beispiels sollte mit der 6-Tage-Avg-Spalte in der beigefügten Kalkulationstabelle übereinstimmen. Ich fand diese Aggregator-Funktion sehr nützlich. Hoffe, Sie werden auch. Um eine asymptotische Leistung von O (n) (wie die Hand-codierte Lösung) zu erreichen, können Sie die Aggregate-Funktion wie in Der akkumulierte Wert (implementiert als anonymer Typ) enthält zwei Felder: Ergebnis enthält Die Ergebnisliste baut bis jetzt auf. Das Arbeiten enthält die letzten Perioden-1 Elemente. Die Aggregatfunktion fügt den aktuellen Wert zur Arbeitsliste hinzu, erstellt den aktuellen Durchschnitt und fügt sie dem Ergebnis hinzu und entfernt dann den ersten (d. H. Ältesten) Wert aus der Arbeitsliste. Das Saatgut (d. h. der Anfangswert für die Akkumulation) wird aufgebaut, indem die ersten Perioden-1-Elemente in die Arbeits-und Initialisierungsergebnis zu einer leeren Liste gebracht werden. Folglich beginnt die Aggregation mit der Elementperiode (durch Überspringen (Perioden-1) - Elemente am Anfang). In der Funktionsprogrammierung ist dies ein typisches Verwendungsmuster für die Aggregat - (oder Falz-) Funktion, btw. Die Lösung ist nicht funktional sauber, da die gleichen Listenobjekte (Arbeit und Ergebnis) in jedem Schritt wiederverwendet werden. Im nicht sicher, wenn das Probleme verursachen könnte, wenn einige zukünftige Übersetzer versuchen, die Aggregate-Funktion automatisch zu parallellisieren (auf der anderen Seite Im auch nicht sicher, wenn das möglich ist, nachdem alle.). Eine rein funktionale Lösung sollte bei jedem Schritt neue Listen anlegen. Beachten Sie außerdem, dass C keine leistungsfähigen Listenausdrücke aufweist. In einigen hypothetischen Python-C-gemischten Pseudocode könnte man die Aggregationsfunktion schreiben, die in meiner bescheidenen Meinung ein wenig eleganter wäre :) Beachte die Laufzeit von O (n2). Da Sie bei jedem Schritt immer mehr Elemente überspringen müssen (und afaik Skip (i) I mal IEnumerator. MoveNext aufrufen muss). Siehe meine Antwort für eine Lösung in O (n) Zeit. (Ich habe gerade bemerkt, der OP-Kommentar unten, dass heshe wird möglicherweise die Werte aus einer SQL-DB in der Zukunft. In diesem Fall würde ich jede starke entmutigen von dieser Lösung) ndash MartinStettner Mar 3 11 at 0:53 Für die effizienteste Art und Weise möglich Um einen Moving Average mit LINQ zu berechnen, sollten Sie LINQ nicht verwenden Ich schlage vor, eine Helper-Klasse zu erstellen, die einen gleitenden Durchschnitt auf eine möglichst effiziente Weise berechnet (mit einem kreisförmigen Puffer und einem kausalen gleitenden Durchschnittsfilter) und dann eine Erweiterungsmethode Zu LINQ. First up, der gleitende Durchschnitt Diese Klasse bietet eine sehr schnelle und leichte Implementierung eines MovingAverage-Filters. Es erzeugt einen kreisförmigen Puffer der Länge N und berechnet eine Addition, eine Subtraktion und eine Multiplikation pro angehängten Datenpunkt, im Gegensatz zu den N Multiplikations-Adds pro Punkt für die Brute-Force-Implementierung. Die oben genannten Erweiterungsmethoden wickeln die MovingAverage-Klasse und ermöglichen die Einfügung in einen IEnumerable-Stream. Um dies in einer funktionalen Weise zu tun, benötigen Sie eine Scan-Methode, die in Rx, aber nicht in LINQ. Lets schauen, wie es aussehen würde, wenn wed haben eine Scan-Methode Und heres die Scan-Methode, genommen und angepasst von hier: Dies sollte eine bessere Leistung als die Brute-Force-Methode haben, da wir eine laufende Summe verwenden, um die SMA berechnen. Um zu beginnen, müssen wir die erste Periode berechnen, die wir hier Samen nennen. Dann wird jeder nachfolgende Wert aus dem akkumulierten Samenwert berechnet. Dazu benötigen wir den alten Wert (das ist t-delta) und der neueste Wert, für den wir die Serie reihen, einmal von Anfang an und einmal durch das Delta verschoben. Am Ende führen wir einige Bereinigung durch Hinzufügen von Nullen für die Länge der ersten Periode und das Hinzufügen der anfänglichen Seed-Wert. Beantwortet Jun 19 13 am 22:58
FAQs ndash Aktienoptionen Q. Sind Aktienoptionen verfallen A. Aktienoptionen verfallen. Die Gültigkeitsdauer variiert von Plan zu Plan. Verfolgen Sie Ihre optionsrsquo Ausübungszeiträume und Ablaufdaten sehr genau, denn sobald Ihre Optionen verfallen, sind sie wertlos. Oft gibt es Sonderregelungen für beendigte und pensionierte Angestellte und verstorbene Arbeitnehmer. Diese Lebensereignisse können die Exspiration beschleunigen. Überprüfen Sie Ihre Planregeln auf Details zu Ablaufdaten. F. Wie wirkt sich Vesting aus, wenn ich meine Optionen ausüben kann? Ihr Plan kann eine Wartezeit haben, die die Zeit beeinflusst, die Sie zur Ausübung Ihrer Optionen haben müssen. Eine Wartezeit ist die Zeit während der Laufzeit der Option gewähren, dass Sie warten müssen, bis Sie Ihre Optionen ausüben dürfen. Ein Beispiel von Herersquos: Wenn die Laufzeit des Optionsgewinns 10 Jahre beträgt und Ihre Wartezeit zwei Jahre beträgt, können Sie mit der Ausübung Ihrer erworbenen Optionen zum zweiten Jahrest...
Comments
Post a Comment