vielen dank für euere hinweise.
@Hyperion: Nein mir wurde noch nicht gesagt, dass man text-dateien immer m "with" verarbeiten sollte. Ich stelle mir aber die Frage warum? Ist der einzige Grund, dass man sich die Zeilte f.close() spart? Zu dem ist das mit dem with-statement sogar ein wenig langsamer (siehe Beispiel Code weiter unten).
In Zeile 14 generiere ich die Knotennummern, die in der Ausgabedatei benötigt werden.
@ BlackJack: Ich habe die Erfahrung gemacht das List-comprehensions immer schneller Laufen als reine For-Schleifen. Hier ist das auch so, auch wenn der Geschwindigkeitsunterschied marginal ist (ca. 2.5%). Auch wenn unnötiger Weise eine große Liste erzeugt wird ist es dennoch schneller. Also warum sollte ich das dann nicht ausnutzen?
Mich würde jetzt interessieren ob es einen noch schnelleren weg gibt den nodes array in eine textdatei zu schreiben.
Der folgende Code zum Vergleich der einzelnen schreib-methoden
Code: Alles auswählen
import numpy as np
import time
nodes = np.random.rand(1000000,3)
start = time.time()
with open('test1.txt', mode='w') as f:
for i,node_i in enumerate(nodes):
f.write( '%d, %16.14F, %16.14F, %16.14F \n' % (i+1, node_i[0], node_i[1], node_i[2]) )
print 'standard for-schleife (with open...):',time.time()-start
start = time.time()
with open('test2.txt', mode='w') as f:
[f.write( '%d, %16.14F, %16.14F, %16.14F \n' % (i+1, node_i[0], node_i[1], node_i[2]) ) for i,node_i in enumerate(nodes)]
print 'LC (with open...):',time.time()-start
start = time.time()
with open('test3.txt', mode='w') as f:
idx_nodes = np.column_stack( (np.arange(1,len(nodes)+1),nodes) )
np.savetxt(f, idx_nodes, fmt='%d, %16.14F, %16.14F, %16.14F', delimiter=', ', newline='\n')
print 'numpy savetxt (with open...):',time.time()-start
# ============================================================================
start = time.time()
f = open('test1.txt', mode='w')
for i,node_i in enumerate(nodes):
f.write( '%d, %16.14F, %16.14F, %16.14F \n' % (i+1, node_i[0], node_i[1], node_i[2]) )
f.close()
print 'standard for-schleife:',time.time()-start
start = time.time()
f = open('test2.txt', mode='w')
[f.write( '%d, %16.14F, %16.14F, %16.14F \n' % (i+1, node_i[0], node_i[1], node_i[2]) ) for i,node_i in enumerate(nodes)]
f.close()
print 'LC:',time.time()-start
start = time.time()
f = open('test3.txt', mode='w')
idx_nodes = np.column_stack( (np.arange(1,len(nodes)+1),nodes) )
np.savetxt(f, idx_nodes, fmt='%d, %16.14F, %16.14F, %16.14F', delimiter=', ', newline='\n')
f.close()
print 'numpy savetxt:',time.time()-start
gibt mir auf meinem Laptop folgendes aus:
Code: Alles auswählen
standard for-schleife (with open...): 4.68522500992
LC (with open...): 3.95728611946
numpy savetxt (with open...): 5.42520999908
standard for-schleife: 4.33999490738
LC: 3.94807004929
numpy savetxt: 5.56135797501
Da stellt sich mir die Frage ob es wirklich so sinnvoll ist mit dem with statement zu arbeiten