目前,我有2个彼此分开的列表
a = [5,6,7,8]
b = [100,200,300,400]
output = [b/m for b,m in zip(a,b)]
但是由于我的数据库的性质,以不同的方式检索列表a
和b
会更快:
data = [5,100,6,200,7,300,8,400]
列表中的第一个值是a
中的第一个值,第二个值是b
中的第一个值,第三个值是a
中的第二个值,依此类推。< / p>
output = [5/100,6/200,7/300,8/400]
因此,我需要将第一个值除以第二个,将第三个值除以第四个,依此类推。现在这没问题,但我需要它尽可能快。有什么建议吗?
答案 0 :(得分:5)
您可以使用切片:
output = [b / m for b, m in zip(data[::2], data[1::2])]
编辑3:
我们现在拥有的东西(len(data) = 8000
):
iter
解决方案,大约1ms range
解决方案,2.5ms map
解决方案(使用list
实现)2.7ms 答案 1 :(得分:0)
>>> data = [5,100,6,200,7,300,8,400]
>>> [data[i]/float(data[i+1]) for i in range(0,len(data),2)]
[0.05, 0.03, 0.023333333333333334, 0.02]
for i in range(0,len(data),2)
生成 0,2,4,6 。因此data[i]/data[i+1]
给出了data[0]/data[1],...,data[6]/data[7]
答案 2 :(得分:0)
我更喜欢使用zip和map来做这种事情,以便可以在一行中完成:
map(lambda x : x[0]/x[1], zip(a,b))
zip是一个生成元组列表的函数,如下所示:
>>>>zip(a,b)
[(5, 100), (6, 200), (7, 300), (8, 400)]
map会返回一个新列表,将给定函数应用于整行。我看到其他人报告这需要几毫秒。将此问题应用于您的问题并使用IPython中上面给出的列表切片:
%timeit map(lambda x : x[0]/x[1], zip(data[::2], data[1::2]))
1000000 loops, best of 3: 1.33 µs per loop
编辑:len(数据)= 10000,我得到849微秒;有8000,我得到685微秒。