
Bernd Nawothnig, 01.04.2012 11:29:
Es geht bei der ganzen Sache um einen rein numerischen Algorithmus, und da ist Python nun mal prinziell weniger gut für geeignet, weil dort alles Objekte sind, für _jede_ Berechnung also erst die "Nutzlast" aus dem Objekt geholt werden muss. Das ist zwar sehr schön für die Allroundverwendung (also mehr als 99% der real anfallenden Fälle, s.u.), aber ein klarer Nachteil bei einer so speziellen Geschichte.
Deswegen benutzen die Number-Cruncher ja auch NumPy und/oder Cython (und manchmal PyPy).
, weil ich eben schneller werden will (was auch weit über alle Erwartungen geklappt hat ;-). Gerade die dauernden appends, bzw. auch Listcomprehensions, wie Du sie erwähntest (ich weiß, die sind sehr elegant und ich verwende die auch sehr gerne), holen sich jedes Mal Speicher vom Heap, der praktisch dann gleich wieder freigegeben werden kann
Äh, bitte wie? Warum sollten sie das denn tun?
Wenn man Listen so erzeugt, wird jedesmal Speicher vom Heap geholt und der alte Speicherbereich kann freigegeben werden.
Ah, du meinst das realloc(). Nein, da wird im Normallfall kein neuer Speicherbereich alloziiert, sondern nur der alte erweitert. Entweder macht das CPython selbst in seiner Heap-Verwaltung, indem es sich schon vorab größere Bereiche greift, oder das Betriebsystem macht es, notfalls indem es die virtuelle Speicherverwaltung umkonfiguriert. Manchmal muss kopiert werden, aber wenn alles gut läuft, kann das eben auch komplett vermieden werden. Unter'm Strich geht der zusätzliche Aufwand gegen Null. Stefan