2012-03-29 4 views
3

У меня есть класс pymzml.run.Reader из пакета pymzml. Это объект-генератор, при прохождении через него он дает экземпляры класса Spectrum (также из пакета pymzml). Я сравниваю разные экземпляры друг с другом. Поскольку pymzml.run.Reader является объектом-генератором, после их перебора их больше нельзя использовать, поэтому я сохраняю их в списке для сравнения позже.Добавление экземпляров объекта в список работает только с трудоемкой глубиной, как я могу это изменить?

Однако, когда я сохраняю их в списке, а затем просматриваю список, в котором напечатан идентификатор спектров, он показывает, что он сохраняет только последний спектр. Для уточнения:

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') 

дает:

1 
2 
3 
4 
5 
-------------------- 
5 
5 
5 
5 
5 

pymzml имеет функцию deRef(), что делает DeepCopy спектра, поэтому следующий действительно работает правильно:

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') 

Однако , делая deepcopies является основным узким местом, которое я пытаюсь выбраться из приложения. Как добавить экземпляры спектра в список, чтобы несколько раз добавлялся не только последний спектр?

ответ

1

Невозможно просто сохранить последний спектр - вы делаете все правильно, чтобы сохранить каждый объект в списке.

Проблема в том, что вы снова и снова получаете один и тот же объект.

Печать id(spectrum) в цикле, чтобы получить его адрес памяти, покажет, что это один объект, который повторяется с его id и другими измененными атрибутами.

Хотя вам необязательно требуется copy.deepcopy(), вам необходимо сделать копию. Попробуйте copy.copy(), и посмотрите на источник Spectrum.decRef(), чтобы посмотреть, как он выполняет свое копирование.

Скорее всего, вам нужно сделать decRef() каждый, чтобы сделать их независимыми - в противном случае, почему класс предоставит специальный метод?

+0

Да, вы правы, это тот же адрес памяти. Spectrum.deRef() использует deepcopy и лишает их некоторой информации, это просто занимает такое большое время. В любом случае, спасибо за ваш ответ. –