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