Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用给定数字递增数组的快速方法_Python_Algorithm - Fatal编程技术网

Python 用给定数字递增数组的快速方法

Python 用给定数字递增数组的快速方法,python,algorithm,Python,Algorithm,假设我有一个非常大的数组,我想将数组中的每个元素增加一个给定的数字。有没有一种方法可以在不迭代所有元素的情况下实现这一点 我不想对所有元素进行明显的迭代: x = [ a + inc for a in x ] 如果不循环所有数字,就无法修改所有数字。但是,您可以使用在访问时增加数字的内容包装集合 >>> class OffsetCollection(object): ... def __init__(self, collection, offset): ...

假设我有一个非常大的数组,我想将数组中的每个元素增加一个给定的数字。有没有一种方法可以在不迭代所有元素的情况下实现这一点

我不想对所有元素进行明显的迭代:

x = [ a + inc for a in x ]

如果不循环所有数字,就无法修改所有数字。但是,您可以使用在访问时增加数字的内容包装集合

>>> class OffsetCollection(object):
...     def __init__(self, collection, offset):
...         self.collection = collection
...         self.offset = offset
...     def __getitem__(self, key):
...         return self.collection[key] + self.offset
...
>>> a = [1 ,3, 6, 7, 9, 0, 2]
>>> b = OffsetCollection(a, 5)
>>> a[3]
7
>>> b[3]
12

当使用numpy时,它可能需要更轻的操作。假设您在64位数字上使用8位整数,则只需将偏移量添加到64位中的每8位(因此一次添加8个数字),只需一个简单的加法即可。

没有任何神奇的方法可以更新数组中的每个数字,而无需。。。正在更新数组中的每个数字。如果出于某种原因您真的讨厌迭代器,您可以使用不同的措辞:

x = map(lambda i: i + 1, x)

我不确定这是否是你想要的,但是

这是一个恒定的时间操作,称为

现在
y
是惰性生成器。你可以用这种方法在固定的时间内构建一大堆东西


需要时间的是“重建”列表中的元素,但复杂度可以根据从一开始取出的元素数量来降低

我知道的最快的方法之一是使用
Numpy

from time import clock
li = range(500000)
start = clock()
li = [i+5 for i in li]
print "Time taken = %.5f" % (clock() - start)
>> Time taken = 0.06355
VS


请注意,我没有对创建列表本身和创建
Numpy
数组计时。

哦,这与Wolph的答案相同,但他只考虑添加

跟踪要对每个数组元素执行的所有标量操作,并在访问元素时动态执行这些操作,或者下次执行涉及每个元素的非标量操作时执行这些操作


您可以实现一个包装器类,它允许您将数组与标量相加和相乘,只需跟踪标量即可将多个操作合并为一个操作。读取数组的代码将通过执行mx+b操作的包装器。

有没有一种方法可以在不迭代所有元素的情况下执行此操作?-你想要一个固定时间的操作还是什么?如果你没有迭代所有的操作,你如何修改它们?你可以保留一个全局变量
delta
,并使用
delta+x[i]
而不是
x[i]
。不确定它对你的情况会有什么帮助,如果你想要速度,你应该考虑NUPYPY,你要做的是O(N)变化;你怎么能期望比O(n)更快地完成它们呢?这几乎肯定不会更快,生成器是内存优化而不是速度。
from time import clock
li = range(500000)
start = clock()
li = [i+5 for i in li]
print "Time taken = %.5f" % (clock() - start)
>> Time taken = 0.06355
from time import clock
import numpy as np
li = range(500000)
li = np.array(li)
start = clock()
li += 5
print "Time taken = %.5f" % (clock() - start)
>> Time taken = 0.00055