2017-10-28 82 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第一。