在Python中从旧计算新序列的最有效方法是什么?

时间:2013-12-10 21:42:00

标签: python map generator

例如,有一个列表:

s = [1,2,3,4]

我们想从中获取新列表

s1 = [1.5, 2.5, 3.5](长度减少了)。

如何在Python中以最有效的方式计算(例如地图,生成器理解)?

更新的 好的,这个例子非常人为。无意中,我正试图找到从旧计算新列表的最快方法。对我来说,看到最佳方式(例如微小的内存使用)将会很有趣。

4 个答案:

答案 0 :(得分:3)

alist = [(s[i]+s[i+1])/2 for i in range(len(s)-1)]
好吧,我不知道它有多高效。

答案 1 :(得分:1)

我猜测,如果您有一个大型列表,最快的方法如下:

import numpy as np
kernel = np.array([0.5, 0.5]) # convolution kernel
my_list = range(100000) # lots of data
arr = np.array(my_list) # make it an array
result = np.convolve(arr, kernel, 'valid') # convolve

这在数字python包中使用了卷积,这应该非常快。我很想知道是否有人能找到更快的解决方案:)

编辑做了一些基准测试,对于1000+以上的列表,numpy版本比Twisted Meadows版本更快。

答案 2 :(得分:1)

import numpy as np
import numexpr as ne
import numba

my_list = range(100000) # lots of data
arr = np.array(my_list) # make it an array

def numpyConvolve():
    kernel = np.array([0.5, 0.5]) # convolution kernel
    return np.convolve(arr, kernel, 'valid') # convolve

@numba.autojit
def numpyAdd():
    a = arr[:-1]
    b = arr[1:]
    return (a+b)/2.0

def numexprAdd():
    a = arr[:-1]
    b = arr[1:]
    return ne.evaluate("(a+b)/2.0")

In [248]: %timeit numpyConvolve()
100 loops, best of 3: 2.86 ms per loop

In [249]: %timeit numpyAdd()
1000 loops, best of 3: 248 µs per loop  (about 380 µs without numba)

In [250]: %timeit numexprAdd()
10000 loops, best of 3: 148 µs per loop

答案 3 :(得分:0)

对于“小内存使用”,你可以使用Twisted Meadow的解决方案,但是以生成器形式:

new_list = ((s[i]+s[i+1])/2.0 for i in xrange(len(s)-1))

使用()而不是[]将产生一个生成器,xrange()将为该范围生成一个生成器。 Generators与列表类似,只是它们不会立即将整个数组加载到内存中 - 它们会在循环的每次迭代中生成下一个值。