raytracer in Python

Gute Links und Tutorials könnt ihr hier posten.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

http://www.lshift.net/blog/2008/10/29/t ... -in-python

Sourcecode: http://www.lshift.net/~tonyg/raytrace.py

Wäre mal eine Idee wert raytrace.py einmal mit CPython und einmal mit PyPy laufen zu lassen ;)

EDIT: Oh, das wird anscheinend schon gemacht:
https://bitbucket.org/pypy/benchmarks/s ... -simple.py
Siehe: http://speed.pypy.org/timeline/?ben=raytrace-simple

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Auf der Suche nach einem Ray Tracer implementation, welches das multiprocessing nutzt habe ich noch ein paar Interessante Seiten über Python/Raytracing gefunden:

PyGmy
An extremely slow raytracer: http://www.pawfal.org/index.php?page=PyGmy

MiniLight
Ein minimal global illumination renderer: http://www.hxa.name/minilight/
MiniLight ist eigentlich in C++ geschrieben, wurde aber in verschiedenen Sprachen portiert, u.a. in Python. Sourcen habe ich im Python-to-C++ compiler "Shed Skin" gefunden: https://gitorious.org/shedskin/mainline ... xamples/ml

Es gibt bei MiniLight auch Vergleiche:

Code: Alles auswählen

Code Zeilen (gesammt / relativ zu C++)
Python 2.5.1            490 lines / 0.52
Python ShedSkin 0.1.1   496 lines / 0.52

Geschwindigkeit (in bezug zur C++ implementierung):
Python 2.5.1            1 / 180
Python ShedSkin 0.1.1   1 / 1.8
Lustig ist auch die Implementierung in Flash, welches direkt live im Browser rechnet: http://www.hxa.name/minilight/minilight-flex.html

Pygame
Was anderes: Ray-Tracer mit Pygame: http://pygame.org/project-Ray+Tracer-794-.html Kann anscheinend auch .obj Dateien lesen und ist auch recht übersichtlich...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich fand die Idee so toll, da hab ich den Sourcecode mal abgeändert, das man das Rendering live in einem Tkinter Fenster sehen kann: https://github.com/jedie/python-code-sn ... aytrace.py

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So, nachdem ich nun auch TKinter mit PyPy verwenden kann, kann ich mal vergleichen:

PyPy schaft das 640x480 in 13.4Sec
CPython 54.4sec!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

WOW! Damit habe ich definitiv nicht gerechnet, ich habe pypy immer als Spielerei angesehen …

CPython: "Rendered in 23.3sec"
Pypy: "Rendered in 5.2sec"
the more they change the more they stay the same
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Gerade beim raytracer merkt man wie der JIT nach und nach die Sache schneller macht. Wobei es auch wegen dem Szenen-Aufbau am Ende schneller ist...

Ich frage mich allerdings ob PyPy nicht die JIT Optimierungsdaten speichern könnte, um diese beim nächsten Lauf wieder verwenden zu können. Sowas ähnliches wie .pyc...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jens hat geschrieben: Ich frage mich allerdings ob PyPy nicht die JIT Optimierungsdaten speichern könnte, um diese beim nächsten Lauf wieder verwenden zu können. Sowas ähnliches wie .pyc...
Damit verlierst Du dann aber die Plattformunabhängigkeit bzw. müsstest ja vor einem Lauf wissen, ob das System noch dasselbe ist ;-)

Edit: Nicht genug nachgedacht :oops: Man könnte ja mittels Metainformationen das System hinterlegen - zur Laufzeit muss PyPy das intern ja selber ermitteln und bräuchte dann nur noch abgleichen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Außerdem ist die Idee bei JIT ja, dass Just-in-Time optimiert wird, das heißt der auch tatsächlich das optimiert wird, was ein Hotspot ist. Das kann bei mehreren Durchläufen verschiedener Code sein. Jens, was du dir vermutlich wünscht ist sowas wie Profile Guided Optimization (PGO), wie das etwa GCC bietet.

Zudem vermute ich mal das der generierte Code eher enorm ist, wenn man bedenkt dass quasi alle JIT-Compiler relativ viel Speicher benötigen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sowas würde schon Sinn machen ist aber wohl mit etwas Aufwand verbunden.

Ich denke mal Python 3, Numpy und STM haben da höhere Priorität.
Antworten