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

时间:2015-09-12 09:41:50

标签: python algorithm

假设我有一个非常庞大的数组,我想用给定的数字递增数组中的每个元素。有没有办法在不迭代所有元素的情况下做到这一点?

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

x = [ a + inc for a in x ]

5 个答案:

答案 0 :(得分:2)

我所知道的一种紧固方式是使用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

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

请注意,我没有计算列表本身的创建时间以及Numpy数组的创建时间。

答案 1 :(得分:1)

无法在不循环所有数字的情况下修改所有数字。但是你可以用一些在访问时增加数量的东西来包装集合。

Started InternetExplorerDriver server (32-bit) 2.47.0.0

当使用numpy时,它可以通过更轻的操作来完成。假设您在64位数上使用8位整数,则可以简单地将偏移量添加到64位的每8位(一次8个数字),只需添加1个。

答案 2 :(得分:0)

哎呀,这与Wolph的回答相同,但他只考虑加法。

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

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

答案 3 :(得分:-1)

没有......更新数组中的每个数字,没有神奇的方法来更新数组中的每个数字。如果由于某种原因你真的讨厌迭代器,你可以用不同的方式表达它:

{{1}}

答案 4 :(得分:-1)

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

此操作有恒定时间操作,因此称为generators

y = ( a + inc for a in x )

现在y是懒惰的生成器。你可以在不变的时间内以这种方式构建一大堆东西。

需要时间的是,将这个“重建”回到列表中,但复杂性可以根据您从一开始就取出多少元素来减少。