例如:
a = [1,2,3]
x = [2*i for i in a]
y = [3*i for i in a]
如果 a 的大小很大,将列表推导合并为一个(如果可能)会更有效吗?如果是这样,你如何做到这一点?
就像是,
x,y = [2*i, 3*i for i in a]
这是行不通的。如果使用列表推导在计算上并不比使用普通的 for 循环更有效,也请告诉我。谢谢。
例如:
a = [1,2,3]
x = [2*i for i in a]
y = [3*i for i in a]
如果 a 的大小很大,将列表推导合并为一个(如果可能)会更有效吗?如果是这样,你如何做到这一点?
就像是,
x,y = [2*i, 3*i for i in a]
这是行不通的。如果使用列表推导在计算上并不比使用普通的 for 循环更有效,也请告诉我。谢谢。
您想使用带有星号运算符的zip()
内置函数来执行此操作。zip()
通常将列表转换为对列表,当这样使用时,它会解压缩 - 获取对列表并分成两个列表。
>>> a = [1, 2, 3]
>>> x, y = zip(*[(2*i, 3*i) for i in a])
>>> x
(2, 4, 6)
>>> y
(3, 6, 9)
请注意,我不确定这是否真的会更有效。
如果对效率有疑问,请使用 timeit 模块,它总是很容易使用:
import timeit
def f1(aRange):
x = [2*i for i in aRange]
y = [3*i for i in aRange]
return x,y
def f2(aRange):
x, y = zip(*[(2*i, 3*i) for i in aRange])
return x,y
def f3(aRange):
x, y = zip(*((2*i, 3*i) for i in aRange))
return x,y
def f4(aRange):
x = []
y = []
for i in aRange:
x.append(i*2)
y.append(i*3)
return x,y
print "f1: %f" %timeit.Timer("f1(range(100))", "from __main__ import f1").timeit(100000)
print "f2: %f" %timeit.Timer("f2(range(100))", "from __main__ import f2").timeit(100000)
print "f3: %f" %timeit.Timer("f3(range(100))", "from __main__ import f3").timeit(100000)
print "f4: %f" %timeit.Timer("f4(range(100))", "from __main__ import f4").timeit(100000)
结果似乎一致地指出第一个选项是最快的。
f1: 2.127573
f2: 3.551838
f3: 3.859768
f4: 4.282406