假设我有一个非常庞大的数组,我想用给定的数字递增数组中的每个元素。有没有办法在不迭代所有元素的情况下做到这一点?
我不想对所有元素进行明显的迭代:
x = [ a + inc for a in x ]
答案 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)
跟踪要对每个数组元素执行的所有标量操作,并在访问元素时动态执行这些操作,或者下次执行触及每个元素的非标量操作时。
您可以实现一个包装类,它允许您通过标量添加和乘以数组,并且只跟踪标量以将多个操作合并为一个。读取数组的代码将通过执行mx + b操作的包装器。
答案 3 :(得分:-1)
没有......更新数组中的每个数字,没有神奇的方法来更新数组中的每个数字。如果由于某种原因你真的讨厌迭代器,你可以用不同的方式表达它:
{{1}}
答案 4 :(得分:-1)
我不确定这是否是你想要的,但是。
此操作有恒定时间操作,因此称为generators
y = ( a + inc for a in x )
现在y
是懒惰的生成器。你可以在不变的时间内以这种方式构建一大堆东西。
需要时间的是,将这个“重建”回到列表中,但复杂性可以根据您从一开始就取出多少元素来减少。