Python beschleunigen: Pyrex, weave, C++, Cython -- und nun?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Tyrax hat geschrieben:Wegen Psyco: Ich habe mir mal die mutmaßliche Homepage http://psyco.sourceforge.net angesehen, auf der auf das Nachfolgeprojekt PyPy hingewiesen wird. Ich habe mir dazu einige Seiten angesehen und hatte den Eindruck, dass PyPy keine Nachteile gegenüber Psyco hat. Liege ich da richtig?
Ein "Nachteil" könnte die schlechtere Performance sein - das hängt jedoch stark vom Einzelfall ab. Im konkreten Fall - Verwendung von random.gauss() - tun sich die beiden so gut wie nichts. Die Laufzeit halbiert sich in etwa im Vergleich zum normalen CPython. Die schnellste Laufzeit liefert auf meinem Rechner pypy-1.3 (verglichen mit pypy-1.4, pypy-1.5 und psyco).
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Evtl kannst du das noch beschleunigen, in dem du den float-Vergleich 'richtig' machst ('abs(x-y) < EPSILON', mit einem passenden EPSILON).
Folgendes braucht hier ~3min, die originale Funktion ist nach ~20min noch nicht fertig.

Code: Alles auswählen

def dummy_funktion(a, b, c, d):
    gauss = random.gauss
    eps = 1.0e-8
    while True:
        x = gauss(a, b)
        y = gauss(c, d)
        if abs(x-y) < eps:
            break
    return x
Wir haben schon 10% vom 21. Jahrhundert hinter uns!
Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

Danke für den Hinweis, aber dass die ursprünglich von mir gepostete Funktion kein sinnvolles Problem beschreibt, wurde schon mehrfach angemerkt. Dein epsilon ist gerade die 'Kontaktdistanz' die ich in meinem vorletzten Beitrag erwähnt hatte. Der von Dir vorgeschlagene dummy_Funktion ist imho schneller, weil sie einfach etwas anderes simuliert.

Naja, ich werde mir in Zukunft alle Mühe geben, etwas weniger sinnlose Minimalbeispiele zu basteln.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

b.esser-wisser hat geschrieben:Folgendes braucht hier ~3min, die originale Funktion ist nach ~20min noch nicht fertig.
Solltest die Aussage nochmal überdenken :P Es ist doch gar nicht gesagt dass beide Aufrufe die gleiche Anzahl an Durchläufen brauchten.
Wenn ich jetzt etwas an der Funktion umschreibe und sie zufällig nach einem Durchlauf fertig ist ist es nicht unbedingt die performanteste.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@JonasR: ich hab random schon vor jedem Test gleich ge-seed()-et
Tyrax
User
Beiträge: 73
Registriert: Mittwoch 4. Februar 2009, 18:31

@b.esser-wisser: Wie ich schon geschrieben habe: Der Grund dafür, dass Deine Funktion schneller ist, liegt einfach darin, dass Du einen anderen Prozess simulierst. Du kannst ja mal die Schleifendurchläufe in beiden mitzählen und das prüfen.

An der Stelle bringt auch ein identischer Seed nix.
Antworten