如果你樂於使用numpy的...
list(numpy.abs(numpy.ediff1d(l, to_end=l[0]-l[-1])))
這較長的l
很好地擴展。不從一個列表轉換或從一個列表轉換會加速很多事情(無論如何,通常可以使用一個numpy數組代替列表)。
或者你可以youself使用numpy.roll
構造它:
list(numpy.abs(l - numpy.roll(l, -1)))
幾個時段:
In [37]: l = list(numpy.random.randn(1000))
In [38]: timeit [abs(v - l[(i+1)%len(l)]) for i, v in enumerate(l)]
1000 loops, best of 3: 936 us per loop
In [39]: timeit list(numpy.abs(numpy.ediff1d(l, to_end=l[0]-l[-1])))
1000 loops, best of 3: 367 us per loop
In [40]: _l = numpy.array(l)
In [41]: timeit numpy.abs(numpy.ediff1d(_l, to_end=l[0]-l[-1]))
10000 loops, best of 3: 48.9 us per loop
In [42]: timeit _l = numpy.array(l); list(numpy.abs(_l - numpy.roll(_l, -1)))
1000 loops, best of 3: 350 us per loop
In [43]: timeit numpy.abs(_l - numpy.roll(_l, -1))
10000 loops, best of 3: 32.2 us per loop
如果原始速度是你的事,快還,但不是那麼整齊,您可以用切片直接陣列:
In [78]: timeit a = numpy.empty(_l.shape, _l.dtype); a[:-1] = _l[:-1] - _l[1:]; a[-1] = _l[-1] - _l[0]; a = numpy.abs(a)
10000 loops, best of 3: 20.5 us per loop
更優雅的比我早!使用模數而不是三元if/else很好。 – HennyH 2013-04-30 13:56:44