Strings schnell Verknuepfen

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.
Antworten
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Tag,

ich will die 17. Spalte einer Liste zu einen langen String verknuepfen. Ich habe drei Methoden mit je 5000, 10000 und 25000 Zeilen ausprobiert, und die Zeiten in drei Diagramme geplottet:

Code: Alles auswählen

teiler = 1000


#### methode 1 start
s = ""
s2 = ""
c = 0
ctime = time.time()
t1 = [[0, 0]]
for i in liste:
	s = ''.join((s, str(i[17])))
	c = c + 1
	print c
	if (c % teiler) == 0:
		s2 = ' '.join((s2, s))
		s = ""
#		c = 0
		t1.append([str(time.time() - ctime), str(c)])
print t1
#### methode 1 stopp





#### methode 2 start
s = ""
c = 0
ctime = time.time()
t2 = [[0, 0]]
for i in liste:
	s = ''.join((s, str(i[17])))
	c = c + 1
	print c
	if (c % teiler) == 0:
		t2.append([str(time.time() - ctime), str(c)])
print t2
#### methode 2 stopp







#### methode 3 start
s = ""
c = 0
ctime = time.time()
t3 = [[0, 0]]
for i in liste:
	s = s + ' ' + str(i[17])
	c = c + 1
	print c
	if (c % teiler) == 0:
		t3.append([str(time.time() - ctime), str(c)])
print t3
#### methode 3 stopp






#### Daten in Textdateien um mit gnuplot zu plotten
vergleich = ""
for t, d in (t1, '1'), (t2, '2'), (t3, '3'):

	outfile = open('vergleich.stat' + d, 'w')

	for r in t:

		t = str(r[0])
		l = str(r[1])
		zeile = ' '.join((t, l, '\n'))
		outfile.write(zeile)

outfile.close()
Bild Bild Bild

Was gibt es sonst noch fuer schnellere Methoden?
lunar

Bei einer Liste von Listen dürfte Folgendes so ziemlich die beste Methode zum Verknüpfen der 17. Spalte sein:

Code: Alles auswählen

' '.join(str(l[17]) for l in lists)
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ich hatte an sowas gedacht (was allerdings fehlt ist das str() )

Code: Alles auswählen

In [24]: import string

In [25]: import operator

In [26]: data = [list(string.ascii_letters) for _ in range(1000)]

In [27]: "".join(imap(operator.itemgetter(17), data))
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Vielen Dank euch zwei. Beide Methoden sind sehr fix, die von Zap ist die schnellere. Allerdings musste ich "imap" durch "map" ersetzen, ist das korrekt oder fehlt mir etwas?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

itertools.imap
MfG
HWK
Antworten