2017-09-29 5 views
0

Ich habe Code, der unten angegeben wird:Verkettung Ersetzen mit beitreten

for pileupcolumn in samfile.pileup(max_depth = 1000000) : 
    X.append(pileupcolumn.n) 
    for pileupread in pileupcolumn.pileups: 
    if (pileupread.alignment.mapping_quality <= 15): 
      continue  
    if not pileupread.is_del and not pileupread.is_refskip: 
      if pileupread.alignment.query_qualities[pileupread.query_position] < 30: 
      # Skip entries with base phred scores < 10 
        continue 
      if pileupread.alignment.is_reverse: #negative 
        ReverseList[pileupcolumn.pos] += pileupread.alignment.query_sequence[pileupread.query_position] 
      else: 
        ForwardList[pileupcolumn.pos] += pileupread.alignment.query_sequence[pileupread.query_position] 

Der obige Code viel Zeit nimmt und ich möchte Verkettung in der 11. und 13. Zeile ersetzen verbinden. Gibt es einen Weg dazu?

+0

Gibt es einen Grund zu der Annahme, dass die Verkettung im Vergleich zu allem anderen eine merkliche Menge an Zeit benötigt? Die Verwendung von 'Join' wird nicht einfach sein. –

+0

@MarkRansom Da dies Bioinformatik ist, sind die Strings wahrscheinlich sehr lang (DNA-Sequenzen), und wiederholte Verkettung ist sehr wahrscheinlich ein Engpass, da es O (n^2) ist. – Barmar

+0

'Join' ist O (n), weil es die Endergebniszeichenfolge einmal zuweisen und dann alle Eingaben in es kopieren kann. – Barmar

Antwort

1

Anstatt verketten, sammeln Sie die Werte in einer Liste, dann schließen Sie die Liste am Ende der Schleife.

for pileupcolumn in samfile.pileup(max_depth = 1000000) : 
    X.append(pileupcolumn.n) 
    forward = [] 
    reverse = [] 
    for pileupread in pileupcolumn.pileups: 
    if (pileupread.alignment.mapping_quality <= 15): 
      continue  
    if not pileupread.is_del and not pileupread.is_refskip: 
      if pileupread.alignment.query_qualities[pileupread.query_position] < 30: 
      # Skip entries with base phred scores < 10 
        continue 
      if pileupread.alignment.is_reverse: #negative 
        reverse.append(pileupread.alignment.query_sequence[pileupread.query_position]) 
      else: 
        forward.append(pileupread.alignment.query_sequence[pileupread.query_position]) 
    ReverseList[pileupcolumn.pos] += ''.join(reverse) 
    ForwardList[pileupcolumn.pos] += ''.join(forward) 

Ich benutze immer noch Verkettung am Ende, weil diese Optimierung nur für die for pileupread Schleife funktioniert. Wenn verschiedene pileupcolumn Objekte denselben pos haben, müssen wir an diesem Punkt verketten. Wir benötigen diese Verkettung auch, wenn die ReverseList Elemente bereits Werte haben, bevor dieser Code ausgeführt wird.

+0

Ihre Lösung funktioniert nicht, es folgende Fehler geben: Datei "getbases.py", Zeile 33, in ForwardList, ReverseList = getbases (bamfile) File "getbases.py", Zeile 25, in getbases ReverseList [ pileupcolumn.pos] + = reverse.join() IndexError: Listenindex außerhalb des Bereichs –

+0

Das ist ein Problem mit dem Teil des Skripts, den Sie nicht angezeigt haben, wo 'ReverseList' und' ForwardList' initialisiert werden. – Barmar

+0

Der Fehler bedeutet, dass 'pileupcolumn.pos' größer als die Länge von' ReverseList' ist. – Barmar