numpy を使用してよろしければ...
list(numpy.abs(numpy.ediff1d(l, to_end=l[0]-l[-1])))
これは、 long とうまくスケーリングしますl
。リストとの間で変換しないと、処理速度が大幅に向上します (非常に多くの場合、リストの代わりに numpy 配列を使用できます)。
または、次を使用して自分で構築できます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