使用python的lambda,map的高效方法

sud*_*kar 3 python performance lambda list map-function

我需要在Bigtable(db)中存储一个很大的整数列表.为了提高效率,我将它们存储为两个连续项之间的差异.

例如:

 original_list = [1005, 1004, 1003, 1004, 1006] 

存储上面的列表(实际上包含超过1000k的项目)为

start = 1005
diff = [-1, -1, 1, 2]

我能管理得最近的是,

ltp = [start]
map(lambda x: ltp.append(ltp[-1] + x), tick)

我正在寻找一种有效的方法将其转换回原始列表.

tom*_*m10 7

对于如此大的数据结构,numpy将运行良好.对于这个例子,它的速度提高了200倍(见下文),并且更容易编码,基本上就是这样

add.accumulate(diff)
Run Code Online (Sandbox Code Playgroud)

numpy和直接列表操作之间的比较:

import numpy as nx
import timeit

N = 10000

diff_nx = nx.zeros(N, dtype=nx.int)
diff_py = list(diff_nx)

start = 1005

def f0():
    orig = [start]
    for x in diff_py: 
        orig.append(orig[-1] + x)

def f1():
    diff_nx[0] = start
    nx.add.accumulate(diff_nx)

t = timeit.Timer("f0()", "from __main__ import f0, f1, diff_nx, diff_py, nx, start")
print t.timeit(number=1000)
t = timeit.Timer("f1()", "from __main__ import f0, f1, diff_nx, diff_py, nx, start")
print t.timeit(number=1000)
Run Code Online (Sandbox Code Playgroud)

13.4044158459     # for list looping
0.0474112033844   # for numpy accumulate
Run Code Online (Sandbox Code Playgroud)

但实际上,重用已建立的压缩算法似乎更好,比如可以使用PyTables轻松完成,而不是像你在这里做的那样滚动你自己.

此外,在这里,我建议您在数据中读取前置开始项的空间,而不是使用前置术语重建列表,当然,这样您就不必复制了.


drr*_*lvn 6

以下适用于我:

orig = [start]
for x in diff:
    orig.append(orig[-1] + x)
Run Code Online (Sandbox Code Playgroud)

使用map将创建一个相同大小的新数组,填充None.我还发现一个简单的for循环更具可读性,在这种情况下,你可以尽可能快地获得.

  • @sudhakar:在Python中,lambda非常低效 - 函数调用很慢,对匿名函数的调用甚至更慢. (3认同)
  • @fsanches:列表推导在某些情况下更快,但在这一个(使用以前的值构建列表)会明显变慢,因为它需要创建中间列表. (2认同)