Ich danke euch allen für die Bemühungen und versuche hier jetzt nocheinmal das ganze Schritt für Schritt zu erklären. Ich möchte ein Optimierungstool für ein Programm schreiben, das Spannungen in einem Bauteil berechnet.
Das Bauteil gebe ich einmal über eine endliche Zahl von "Hexaedern" an mit jeweils 8 Knoten, sprich eine endliche Zahl von Zeilen (können aber 50k-100k sein.
Code: Alles auswählen
.
.
10120, 3549, 7, 1924, 5585, 5571, 1920, 5579, 6574
10121, 1924, 5, 3548, 5585, 5579, 1922, 5578, 6574
10122, 3548, 846, 3550, 5585, 5578, 1074, 3906, 6574
10123, 3550, 847, 3549, 5585, 3906, 1075, 5571, 6574
10124, 1927, 9, 1926, 5583, 5573, 1918, 5575, 7320
10125, 1926, 6, 1923, 5583, 5575, 1921, 5580, 7320
10126, 1923, 5, 1924, 5583, 5580, 1922, 5579, 7320
.
.
Also folgendes Format: 'Hexaeder-ID' | 'Knoten-ID Nr. 1' | 'Knoten-ID Nr. 2' | 'Knoten-ID Nr. 3' | 'Knoten-ID Nr. 4' | 'Knoten-ID Nr. 5' | 'Knoten-ID Nr. 6' | 'Knoten-ID Nr. 7' | 'Knoten-ID Nr. 8'. (Die Kommas am ende jeder Zeile habe ich künstlich danach hinzugefügt um diese Knoten-IDs auch zu finden).
Ich habe den Umweg auch genommen, die Knoten-IDs gehen von 1 bis k .. die Hexaeder-IDs von k+1 bis n. Das ist für den letzten Schritt wichtig - somit werden nur nach den Knoten-IDs gesucht.
Nun fängt die While-True-Loop an.
- Das externe Programm ermittelt jetzt die Spannung an jedem Knoten und gibt folgende symmetrische Spannungsmatrix 3x3 aus:
Code: Alles auswählen
-1 1 3.84184E-05 3.84278E-05 1.23590E-05 1.04524E-05 2.44347E-06-2.43066E-06
-1 2 2.99835E+03-9.01701E+04-7.49139E+03-2.51101E+04 1.14856E+02-9.13784E+03
-1 3 1.52681E+04 7.13507E+03 6.72099E+03-5.53559E+03-5.62050E+02 1.20147E+03
-1 4-1.54632E+04-7.26260E+03-6.81779E+03-5.62534E+03-5.62893E+02-1.21344E+03
-1 5-4.52890E+03-7.54432E+02-1.84319E+02-7.18039E+02 3.75005E+01 1.95846E+02
-1 6-3.76346E+03-8.58813E+02-1.66918E+02-7.73586E+02 3.66762E+01 1.37278E+02
-1 7-3.95179E+03-1.59346E+02-4.61522E+00-4.69564E+02 9.97944E+00 3.56487E+01
-1 8-3.20461E+03-8.19883E+02-1.44846E+02-7.59709E+02 3.00482E+01 1.09170E+02
.
.
Dabei entsrpicht hier 1-8 der ID des Knoten und dann die Matrix-elemente. Über eine mathematische Beziehung berechne ich jetzt dann einen Quantitativen Wert 'XA' und speichere ihn in eine temporäre Datei, die folgendermaßen aussieht:
Code: Alles auswählen
-1.73932E-02
8.24427E-02
1.00211E-01
1.22996E-01
1.52645E-01
1.88661E-01
2.07566E-01
2.40574E-01
Dabei nutze ich den Vorteil, dass die Knoten ab 1 beginnen. jetzt entspricht Zeile 1 dem Wert für Knoten 1, Zeile 2 dem Wert für Knoten 2 usw.
Jetzt berechne ich (XA_0 wird durch den User vorgegeben:
Daraus kann ich jetzt die Ursprüngliche Liste 'b' ermitteln (man sieht hier habe ich die Kommas mit drin) und suche nach den 'Hexaedern'.
Jetzt kommt der vorherige Code:
Code: Alles auswählen
test1 = [e for e in a if any(x in e for x in b)]
#do something to test1
Alle Schritte benötigen 2-3 Sekunden bei einer 0,5-MB Ursprungsdatei. Lediglich der letzte dauert 10 Sekunden und mehr, das steigt proportional zur Dateigröße, genau das möchte ich beschleunigen.
Gruß
Stoli
Und danke für eure Hilfe!