आप परिणाम का कुशलता से उपयोग itertools.teeऔर zipनिर्माण कर सकते हैं :
from itertools import tee
# python2 only:
#from itertools import izip as zip
def differences(seq):
iterable, copied = tee(seq)
next(copied)
for x, y in zip(iterable, copied):
yield y - x
या itertools.isliceइसके बजाय का उपयोग कर :
from itertools import islice
def differences(seq):
nexts = islice(seq, 1, None)
for x, y in zip(seq, nexts):
yield y - x
आप itertoolsमॉड्यूल का उपयोग करने से भी बच सकते हैं :
def differences(seq):
iterable = iter(seq)
prev = next(iterable)
for element in iterable:
yield element - prev
prev = element
यदि आप सभी परिणामों को संग्रहीत करने और अनंत पुनरावृत्तियों का समर्थन करने की आवश्यकता नहीं है, तो ये सभी समाधान निरंतर स्थान में काम करते हैं।
यहाँ समाधान के कुछ सूक्ष्म मानक हैं:
In [12]: L = range(10**6)
In [13]: from collections import deque
In [15]: %timeit deque(differences_tee(L), maxlen=0)
10 loops, best of 3: 122 ms per loop
In [16]: %timeit deque(differences_islice(L), maxlen=0)
10 loops, best of 3: 127 ms per loop
In [17]: %timeit deque(differences_no_it(L), maxlen=0)
10 loops, best of 3: 89.9 ms per loop
और अन्य प्रस्तावित समाधान:
In [18]: %timeit [x[1] - x[0] for x in zip(L[1:], L)]
10 loops, best of 3: 163 ms per loop
In [19]: %timeit [L[i+1]-L[i] for i in range(len(L)-1)]
1 loops, best of 3: 395 ms per loop
In [20]: import numpy as np
In [21]: %timeit np.diff(L)
1 loops, best of 3: 479 ms per loop
In [35]: %%timeit
...: res = []
...: for i in range(len(L) - 1):
...: res.append(L[i+1] - L[i])
...:
1 loops, best of 3: 234 ms per loop
ध्यान दें कि:
zip(L[1:], L)पहले zip(L[1:], L[:-1])से zipही कम से कम इनपुट पर समाप्त होने के बराबर है , हालांकि यह पूरी नकल से बचा जाता है L।
- इंडेक्स द्वारा एकल तत्वों तक पहुंच बहुत धीमी है क्योंकि हर इंडेक्स एक्सेस अजगर में एक विधि कॉल है
numpy.diffयह धीमा है क्योंकि इसे पहले a में बदलना listहै ndarray। जाहिर है अगर आप इसके साथ शुरू करते हैं तो ndarrayयह बहुत तेज होगा:
In [22]: arr = np.array(L)
In [23]: %timeit np.diff(arr)
100 loops, best of 3: 3.02 ms per loop
[abs(j-i) for i,j in zip(t, t[1:])]