2012-03-29 3 views
3

私はpymzmlパッケージからpymzml.run.Readerクラスを持っています。これはジェネレータオブジェクトで、これをループすると、(pymzmlパッケージからの)Spectrumクラスのインスタンスが生成されます。私はお互いに異なるインスタンスを比較しています。 pymzml.run.Readerはジェネレータオブジェクトであるため、それらをループした後は使用できませんので、後で比較するためにリストに保存します。オブジェクトのインスタンスをリストに追加することは、時間のかかるディープコピーでのみ機能しますが、どのように変更できますか?

しかし、それらをリストに保存して、スペクトルのIDを印刷するリストをループすると、最後のスペクトルのみが保存されることがわかります。明確にする:

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は、以下が正常に動作しないので、スペクトルのdeepcopyを作るDEREF()関数があります。しかし

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

私がアプリケーションから抜け出そうとしている深刻なボトルネックとなっています。どのようにしてスペクトルインスタンスをリストに追加すれば、最後のスペクトルだけでなく、複数回追加することができますか?

答えて

1

最後のスペクトルを保存するだけではなく、各オブジェクトをリストに保存するのに適切なことをしています。

問題は、同じオブジェクトを何度も繰り返していることです。

id(spectrum)のループを印刷してメモリアドレスを取得すると、そのオブジェクトがidで繰り返され、その他の属性が変更されたことが示されます。

copy.deepcopy()は必ずしも必要ではありませんが、コピーを作成する必要があります。 copy.copy()を試し、Spectrum.decRef()のソースを参照してコピーの仕組みを確認してください。

ほとんどの場合、decRef()はそれぞれ独立している必要があります。そうでなければ、クラスが特別な方法を提供するのはなぜですか?

+0

はい、そうです、それは同じメモリアドレスです。 Spectrum.deRef()はdeepcopyを使い、いくつかの情報を取り除きます。ちょうどそのような大きな時間がかかります。とにかく、あなたの答えに感謝します。 –

関連する問題