2016-07-26 38 views
1

我目前正在研究分析偏斜差異的腳本。不幸的是,我的問題是,當字符串的長度增加時,運行時間變得太長,我似乎無法計算出我的答案。運行時間太長,對於GC偏斜

def SkewGC(file): 
    countG = 0 
    countC = 0 
    diffGtoC = "" 
    # first, we need to find number of G's. 
    # the idea is, if G appears, we add it to the count. 
    # We'll just do the same to each one. 
    for pos in range(0,len(file)): 
     if file[pos] == "G": 
      countG = countG+1 
     if file[pos] == "C": 
      countC = countC+1 
     diffGtoC = diffGtoC + str(countG-countC) + "," 
    return diffGtoC.split(",") 

SkewGCArray = SkewGC(data) 
# This because I included extra "," at the end... 
SkewGCArray = [int(i) for i in SkewGCArray[:len(SkewGCArray)-1]] 

def min_locator(file): 
    min_indices = "" 
    for pos in range(0,len(file)): 
     if file[pos] == min(file): 
      min_indices = min_indices + str(pos) + " " 
    return min_indices 

print min_locator(SkewGCArray) 

本質上,這個腳本計算G和C(對應於DNA核苷酸)的數目,獲得在每個位置的差異,然後我試圖找到最小的索引。它適用於低文件長度(這是輸入字符串),但是當長度變得很大時 - 即使像90000+,然後我的腳本運行但無法在合理的時間內解析爲答案(〜4-5分鐘)。

任何人都可以指出我能做些什麼來使它更快嗎?我想過是否更好說,獲得差異(diffGtoC),將其設置爲最小值,然後重新計算每個差值,直到它看到不同的期間,我也將取代最小值。

但我對這種方法的擔心是找到並保留最小指數。如果我說,曾與值的數組:

[-4,-2,-5,-6,-5,-6]

我可以看到如何改變的最小值(-4至 - 5,然後到-6)在算法運行時方面會更快,但我將如何能夠保持-6的位置?不知道這是否完全有道理。

回答

0

幾點建議,以提高代碼的性能:

diffGtoC = diffGtoC + str(countG-countC) + "," 
    return diffGtoC.split(",") 

實際上相當於:

diffGtoC = list() 
diffGtoC.append(countG - countC) 

字符串是Python中不變的,所以你生成的每個位置一個新的字符串,效率不高。使用列表還可以節省您正在執行的strint轉換以及您的列表的截斷。您也可以使用pop()刪除列表中的最後一項,而不是生成新的項目。

一個非常簡單的替代方法是搜索最小值並只存儲最小值和它的位置。然後從最小位置開始迭代,看看是否可以再次找到最小值,如果是,則將其追加到第一個最小位置。減少數據處理,節省時間和內存。