2017-10-28 79 views
2

我有一個數字列表(基本示例)[50,100,150,200,250]我需要從指定的索引和指定的數量中增加(或減少)每個數字。我已經能夠做到這一點有兩種方法:從某個點列表中的Python增量數字

from itertools import islice 

l = [50,100,150,200,250] 
start_increment_index = 3 

l[start_increment_index:] = [e+100 for e in l[start_increment_index:]] 
print (l) 

l = [50,100,150,200,250] 

l[start_increment_index:] = [e+100 for e in islice(l,start_increment_index,len(l))] 
print (l) 

兩個打印:[50, 100, 150, 300, 350]

但是,我真正的列表中包含數以百萬計的數字,並用不同的指標和不同的遞增/遞減反覆進行此操作。有沒有更快的方式使用Python列表來完成此操作?我一直在考慮編寫我自己的C/C++擴展來處理這個問題

編輯:這對Python一般來說會是一個有用的模塊嗎?用C語言編寫的函數可以帶參數(python_list_object, increment_amount, start_index, end_index)

+1

如果問一個Python問題,不要添加不相關的語言標記(如C或C++)。如果您*寫* C或C++模塊,*然後*您可以使用(相關)標籤的問題。 –

+0

檢查Python的數組結構,它是有效的數值數組 – Vinny

+1

如果您需要最佳性能,您應該編寫一個C/C++程序(該算法編寫簡單,並且可能有一點線程可優化性)。否則,如果你的目標是完成這一項工作,只要堅持這個腳本並等待答案;一般來說,這取決於數字有多大(如數百萬或數萬億),以及您認爲您將使用此腳本/程序的次數。 –

回答

1

它具體取決於你的目標。我想你可以在這種情況下使用分段樹。欲瞭解更多信息,請參閱https://en.m.wikipedia.org/wiki/Segment_tree

僅作簡要說明。這個結構代表將要執行的範圍操作的數組(例如,帶有數字的加法/減法子數組)。這種結構針對這種範圍查詢數量非常大的情況進行了優化。

注意:如果你希望只使用Python列表結構,則可以實現疏表(它在陣列樹的隱式存儲段樹的另一個視圖)

1
在您的解決方案

主要問題是你創造(分配內存+複製)兩個列表。首先是它本身的列表理解和第二個l[start_increment_index:]

如果數據源是Python列表,你可以做你的O(N)操作:

for i in range(start_increment_index, len(l)): 
    l[i] += increment 

NB:定義increment第一。