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)
我正在寻找一种有效的方法将其转换回原始列表.
对于如此大的数据结构,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轻松完成,而不是像你在这里做的那样滚动你自己.
此外,在这里,我建议您在数据中读取前置开始项的空间,而不是使用前置术语重建列表,当然,这样您就不必复制了.
以下适用于我:
orig = [start]
for x in diff:
orig.append(orig[-1] + x)
Run Code Online (Sandbox Code Playgroud)
使用map将创建一个相同大小的新数组,填充None.我还发现一个简单的for循环更具可读性,在这种情况下,你可以尽可能快地获得.