আপনি ফলাফলটি দক্ষতার সাথে তৈরি করতে 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
হয় ধীর প্রতি রূপান্তর এটি প্রথম কারণ 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:])]