"Leere Listen " mir for Schleife erzeugen

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.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@bob1704: Du gehst Deine Liste auch für jeden Listeneintrag nochmals komplett durch. Du solltest Deine shear_value und axial_value in einem Dictionary mit Key swp_point sammeln und zum Schluß, nachdem Du alle Einträge einmal durchgegangen bist die Maxima bilden.
bob1704
User
Beiträge: 27
Registriert: Dienstag 5. März 2013, 21:28

Hallo,
habt ihr vllr einen Ansatz dafür?

Stehe im Moment etwas auf dem Schlauch ...

Danke
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ungetestet ungefähr so:

Code: Alles auswählen

import collections
point_values = collections.defaultdict(lambda: ([],[]))

for row in sw_forc_updated:
    elements = row.split()
    axial, shear = point_values[elements[8]]
    axial.append(float(elements[1]))
    shear.append(float(elements[2]))

with file("swforc.minmax", "w") as swforc:
    swforc.write(''.join(
        '%s\t%s\t%s\n'%(swp_point, max(axial_force), max(shear_force))
        for swp_point, (axial_force, shear_force) in point_values.iteritems()
    ))
bob1704
User
Beiträge: 27
Registriert: Dienstag 5. März 2013, 21:28

Sirius3 hat geschrieben:Ungetestet ungefähr so:

Code: Alles auswählen

import collections
point_values = collections.defaultdict(lambda: ([],[]))

for row in sw_forc_updated:
    elements = row.split()
    axial, shear = point_values[elements[8]]
    axial.append(float(elements[1]))
    shear.append(float(elements[2]))

with file("swforc.minmax", "w") as swforc:
    swforc.write(''.join(
        '%s\t%s\t%s\n'%(swp_point, max(axial_force), max(shear_force))
        for swp_point, (axial_force, shear_force) in point_values.iteritems()
    ))
Danke funktioniert...

Allerdings habe ich nicht wirklich verstanden was du da machst....

Könntest noch 2-2 Sätze erläutern..?

Danke
BlackJack

@bob1704: Zu Deinem letzten Ansatz der so langsam war: Überleg doch mal wie oft dort was ausgeführt wird in Abhängigkeit von der Länge von `sw_forc_updated`.

Zum Beispiel wie oft Zeilen mit `split()` zerlegt werden. Wenn `sw_forc_updated` 1.000 Zeilen enthält, dann wird für jede Zeile noch einmal jede Zeile betrachtet. Also insgesamt 1.000·1.000=1.000.000 mal. Für jeden inneren und jeden äusseren Schleifendurchlauf wird mindestens einmal `split()` aufgerufen. Das wären dann 1.001.000 Aufrufe Minimum. Wenn die Werte in Spalte 8 eindeutig sind, dann kommen noch mal zwei Aufrufe pro Zeile hinzu, also Minimum 1.003.000 Aufrufe. Im schlechtesten Fall enthalten alle Zeilen den gleichen Wert in Spalte 8, dann sind es 3.001.000 Aufrufe. Wo eigentlich insgesamt nur 1000 notwendig wären, denn man müsste jede Zeile ja nur *einmal* in ihre Einzelteile zerlegen. Das sind 3 *Millionen* unnötige Aufrufe. Und diese Verschwendung steigt quadratisch mit der Anzahl der Zeilen. Bei 5.000 Zeilen hat man schon mindestens 25 Millionen unnötige Zerlegungen und bei 10.000 Zeilen sind es 100 Millionen. Minimum!

Das ist aber sowieso komisch gelöst, denn entweder sind die Werte in Spalte 8 eindeutig — dann braucht man die innere Schleife überhaupt nicht; oder die Werte können mehrfach vorkommen — dann würde für jedes Vorkommen aber völlig unnötigerweise die gleiche Aufwändige Berechnung jedes mal durchgeführt. Es kommt aber jedes mal das gleiche Ergebnis dabei heraus. Das macht keinen Sinn.
bob1704
User
Beiträge: 27
Registriert: Dienstag 5. März 2013, 21:28

bob1704 hat geschrieben:Das ist aber sowieso komisch gelöst, denn entweder sind die Werte in Spalte 8 eindeutig — dann braucht man die innere Schleife überhaupt nicht; oder die Werte können mehrfach vorkommen — dann würde für jedes Vorkommen aber völlig unnötigerweise die gleiche Aufwändige Berechnung jedes mal durchgeführt. Es kommt aber jedes mal das gleiche Ergebnis dabei heraus. Das macht keinen Sinn.
@BlackJack Ja der Grund für die innere Schleife war/ ist das es zu jeder ID mehrere Werte gibt.

Sprich in meinem File kommt jeden ID ca. 27 mal und hat jeweils andere Werte. (Wobei ich die Maxima aus den 27 benötige)
BlackJack

@bob1704: In der inneren Schleife hast Du doch dann aber das Maximum der 27 Werte 27 mal berechnet. Für jeden Wert einmal.
bob1704
User
Beiträge: 27
Registriert: Dienstag 5. März 2013, 21:28

@ BlackJack:
Wie würdest du ändern, hab im Moment leider keine Idee.....

Also wie gesagt, das ganze sind ca. 11000 ID´s , wobei jede ca. 27 mal vorkommt(mit verschiedenen axial/shear_value)...
Sprich das file besteht aus ca. 297000 Zeilen..!
BlackJack

@bob1704: Du hast doch jetzt schon eine Lösung von Sirius3.

Edit: Die Zahl noch mal auf Deinen ursprünglichen Ansatz bezogen bedeutet, das die innere Schleife 297.000²=88.209.000.000 also etwas mehr als 88 Milliarden mal durchlaufen werden muss. Das dauert dann in der Tat *etwas* länger.
bob1704
User
Beiträge: 27
Registriert: Dienstag 5. März 2013, 21:28

BlackJack hat geschrieben:@bob1704: Du hast doch jetzt schon eine Lösung von Sirius3.

Edit: Die Zahl noch mal auf Deinen ursprünglichen Ansatz bezogen bedeutet, das die innere Schleife 297.000²=88.209.000.000 also etwas mehr als 88 Milliarden mal durchlaufen werden muss. Das dauert dann in der Tat *etwas* länger.
^

Ja mit gehts auch eher darum meinen Ansatz , des Verständniss wegen, abzuänder bbzw. zu verbseeren....
BlackJack

@bob1704: Dein Ansatz ist ja im Grunde falsch, weil Du die selben ca. 11.000 Ergebnisse jeweils ca. 27 mal berechnest. Man würde da in einem ersten Schritt erst einmal die Daten auf die einzelnen IDs aufteilen, so dass man 11.000 IDs auf Listen abbildet, welche die 27 dazugehörigen Werte enthalten. Und davon berechnet man dann die Maximalwerte. Genau das macht der Code von Sirius3. Und zwar auf eine sehr einfache und direkte Art. Das sollte im Grunde selbsterklärend sein wenn man Wörterbücher im Allgemeinen und `collections.defaultdict` im Besonderen verstanden hat. Wobei das jetzt auch keine Hexerei ist. Das ist halt ein Wörterbuch das zu *jedem* Schlüssel einen Wert liefert. Entweder den Wert der vorher zugewiesen wurde, oder das Ergebnis eines Aufrufs der Funktion die beim erstellen des Wörterbuch-Objekts übergeben wurde.
Antworten