例如,有一个列表:
s = [1,2,3,4]
我们想从中获取新列表
s1 = [1.5, 2.5, 3.5]
(长度减少了)。
如何在Python中以最有效的方式计算(例如地图,生成器理解)?
更新的 好的,这个例子非常人为。无意中,我正试图找到从旧计算新列表的最快方法。对我来说,看到最佳方式(例如微小的内存使用)将会很有趣。
答案 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与列表类似,只是它们不会立即将整个数组加载到内存中 - 它们会在循环的每次迭代中生成下一个值。