2012-03-29 1 views
3

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?

Antwort

1

Es kann nicht nur das letzte Spektrum gespeichert werden - Sie tun alles, um jedes Objekt in der Liste zu speichern.

Das Problem ist, dass Sie das gleiche Objekt immer und immer wieder bekommen.

Drucken id(spectrum) in der Schleife, um seine Speicheradresse wird zeigen, dass es ein Objekt mit seiner id und anderen geänderten Attribute wiederholt wird. Wenn Sie nicht unbedingt copy.deepcopy() benötigen, müssen Sie eine Kopie erstellen. Versuchen Sie copy.copy(), und schauen Sie sich die Quelle von Spectrum.decRef() an, um zu sehen, wie es kopiert.

Am wahrscheinlichsten, müssen Sie decRef() jeder, um sie unabhängig zu machen - sonst, warum würde die Klasse eine spezielle Methode zur Verfügung stellen?

+0

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. –

Verwandte Themen