说我有一个清单
alist = [6, 6, 6, 3, 1]
我希望将列表中的每个元素乘以4并返回
alist = [24, 24, 24, 12, 4]
我目前的方法是遍历列表并乘以每个元素,就像:
for i in range(len(alist)):
alist[i] = alist[i] * 4
这是非常低效的,因为一旦计算出第一个6 * 4,再次为第二个和第三个六个计算它是多余的。当我做比赛问题时,一旦数字变大,它总是超过时间限制。
有没有办法做同样的乘法过程不一遍又一遍地计算同样的事情?
答案 0 :(得分:2)
有趣的问题,这可能是您正在寻找的:
forEach
答案 1 :(得分:2)
您可以使用memoized函数,这意味着它可以查找旧结果。对于乘法,这可能没什么用,但对于更复杂的操作,它可以大大提高性能。
cached_results = {}
def calc(a, b):
if (a, b) not in cached_results:
cached_results[(a, b)] = a*b
else:
print "already calculated value for (%s, %s)" % (a, b)
return cached_results[(a, b)]
alist = [6, 6, 6, 3, 1]
print [calc(x, 4) for x in alist]
答案 2 :(得分:1)
我不确定乘法是否是您想在此优化的。相反,使用列表理解:
alist = [n * 4 for n in alist]
或者,使用map
alist = map(lambda n: n * 4, alist)
还建议Python Wiki on Performance Tips:
列表推导也在2.0版本中添加到Python中。它们提供了一种语法上更紧凑,更有效的编写上述for循环的方法。
答案 3 :(得分:1)
对于较长的列表,numpy数组可能是更好的选择:
anarray = numpy.array([6,6,6,3,1])
anarray *= 4
我很确定任何类型的查找以确保您不进行两次相同的乘法所需的时间比实际再次进行乘法要长。
答案 4 :(得分:0)
你可以像列表理解一样简单。
alist = [6,6,6,3,1]
result = [x*4 for x in alist]
print result
答案 5 :(得分:0)
好问题在python中使用内置方法 append() 假设在你的情况下它就像给定列表一样 aList = [6,6,6,3,1] 然后使用
B =列表()
for al in alist:
b.append(i*4)
打印b #new列表将取结果