Ich habe eine pymzml.run.Reader-Klasse aus dem Paket pymzml. Dies ist ein Generatorobjekt, das beim Durchschleifen Instanzen der Spectrum-Klasse (auch aus dem pymzml-Paket) liefert. Ich vergleiche verschiedene Instanzen miteinander. Da pymzml.run.Reader ein Generator-Objekt ist, kann es nach dem Durchlaufen nicht mehr benutzt werden, also speichere ich es später in einer Liste zum Vergleich.Das Hinzufügen von Instanzen eines Objekts zu einer Liste funktioniert nur mit zeitaufwendigem decopy, wie kann ich das ändern?
Wenn ich sie jedoch in einer Liste speichern und dann durch die Liste mit den IDs der Spektren laufen lasse, wird nur das letzte Spektrum gespeichert. Zur Klarstellung:
import pymzml
def test(msrun):
for spectrum in msrun:
print spectrum['id']
spectrumList.append(spectrum)
print '-'*20
for i in spectrumList:
print i['id']
msrun = pymzml.run.Reader(r'JG_Ti02-C1-1_C2-01A_file1.aligned.mzML')
gibt:
1
2
3
4
5
--------------------
5
5
5
5
5
Die pymzml eine deref() Funktion hat, die eine deep des Spektrums macht, so dass die folgende tut richtig funktionieren:
import pymzml
def test(msrun):
for spectrum in msrun:
print spectrum['id']
spectrumList.append(spectrum.deRef())
msrun = pymzml.run.Reader(r'JG_Ti02-C1-1_C2-01A_file1.aligned.mzML')
jedoch Deepcopies zu machen ist ein großer Engpass, den ich aus meiner Anwendung herausholen möchte. Wie kann ich die Spektrum-Instanzen an eine Liste anhängen, so dass nicht nur das letzte Spektrum mehrfach angehängt wird?
Ja, Sie haben Recht, es ist die gleiche Speicheradresse. Spectrum.deRef() benutzt decopy und streift einige Informationen aus, es dauert nur so viel Zeit. Wie auch immer, danke für deine Antwort. –