2012-04-13 15 views
9

Ich bin dabei, ein R-Skript in C-Code aus Gründen der Geschwindigkeit zu konvertieren und für die Fähigkeit, es als .exe zu packen. Ich bin neu in C.Umwandlung von R-Code in C-Code

Meine Frage ist wird es deutlich schneller in C sein? Der Ratenbegrenzungsschritt ist ein Sortieralgorithmus, der häufig auf große Vektoren angewendet werden muss. Ich bin mir nicht sicher, ob die vektorisierte Funktionalität in R dies hilft oder verlangsamt. Auch ich habe gelesen, dass for-Schleifen sind ineffizient in

Wenn ich dies in C tun sollte, welche Bibliotheken können mir helfen, einige der Datenverarbeitungsfunktionen von R wie grundlegende Matrixmanipulationen nachzuahmen? Wo soll ich anfangen? Im Moment weiß ich nicht einmal, wie ich meine Daten in C (durch Komma getrennte Textdatei) lesen soll.

+1

Welche Art von Beschleunigung möchten Sie erreichen? Warum denken Sie, dass R für diese Operationen deutlich langsamer als C ist? Hast du http://stackoverflow.com/questions/1330944/speed-of-r-programming-language studiert? –

+0

insbesondere sind 'rowSums' und' colSums' bereits ziemlich schnell - Sie werden wahrscheinlich dort nicht viel Leistung herausholen können (und Sie sollten die ziemlich reiche Sparse-Matrix-Unterstützung in der 'Matrix' berücksichtigen) Paket, wenn Ihre Matrizen spärlich sind ...). Kannst du ein bisschen genauer über "die Fähigkeit sagen, die Maschinen anderer Benutzer laufen zu lassen"? –

+1

Das wird eine Menge Arbeit sein, insb. da Sie von vorne anfangen mit C-Programmierung. Sie könnten [installieren R] (http://cran.r-project.org/bin/windows/rw-FAQ.html) auf den Computern der Benutzer in weniger Zeit als es dauern würde, um den R-Code von Hand zu konvertieren. – hardmath

Antwort

10

Ich werde versuchen, diese Frage so gut wie möglich zu beantworten.

... aber die Frage, die Sie NICHT stellen, ist vielleicht relevanter: Kann der R-Algorithmus in R schneller gemacht werden? Die Antwort hier ist normalerweise "Ja". Kann es "schnell genug" sein? Nun, das ist unmöglich zu beantworten, ohne es zu versuchen (und den aktuellen R-Code zu sehen).

F: Wird mein R-Algorithmus in C schneller sein?

A: Ja! Wenn Sie den "besten" C-Code für den Algorithmus schreiben, wird er wahrscheinlich schneller sein. Es wird höchstwahrscheinlich auch viel mehr Arbeit sein, dies zu tun.

F: Kann die Sortierung von großen Vektoren in C schneller erfolgen?

A: Ja. Mit Multi-Threading können Sie die Geschwindigkeit erheblich verbessern. ... Aber beginnen Sie mit dem Aufruf sort(x, method='quick') in R und sehen, ob das Dinge verbessert! Die Standardmethode ist für Zufallsdaten nicht sehr schnell.

x <- runif(1e7) 
system.time(sort(x))     # 2.50 secs 
system.time(sort(x, method='quick')) # 1.37 secs 
#system.time(tommysort(x))    # 0.51 secs (4 threads) 

Frage: Welche Bibliotheken simulieren grundlegende R-Funktionen?

A: LAPACK/BLAS behandelt Matrix Mathe in R. Wenn das alles ist, können Sie Bibliotheken finden, die viel schneller als die Vanille in R sind (Sie können einige von ihnen auch in R verwenden, um die Leistung zu verbessern!) .

More info on BLAS

Eine andere Möglichkeit ist es, eine .Call von R bis C zu machen und von dort aus haben Sie Zugriff auf alle Funktionen des R! Das Paket inline und das Paket Rcpp können Ihnen dabei helfen.

Eine dritte Möglichkeit besteht darin, R in Ihre Anwendung einzubetten. Rinside kann helfen, das zu erleichtern.

F: Wie lese ich CSV-Daten in C?

A: Sehen Sie sich die Funktionen fopen und fscanf an. ... und verwenden Sie sie, um eine Datenimportfunktion zu schreiben.

+0

Die Zielplattform muss Windows sein (.exe wird erwähnt) und wahrscheinlich AMD64 (32-Bit wird alt, und fast niemand besitzt einen Itanium). Ein guter BLAS wird AVX in AMD64 verwenden, was den Code dramatisch beschleunigen kann (die Alternative ist natürlich eine Schleife). Und selbst in C gilt Dirks Kommentar oben: Profil, Profil, Profil. –

+0

Danke für die ausführliche Antwort! – JoshDG