পাইথন স্ট্যান্ডার্ড লাইব্রেরির টাইমইট মডিউল ব্যবহার করে, আপনি সহজেই আপনার কোডে একটি প্রক্রিয়ার সম্পাদনের সময় পরিমাপ করতে পারেন। এটি একটি দ্রুত চেক জন্য দরকারী.
নিম্নলিখিত দুটি ক্ষেত্রে এখানে আলোচনা করা হবে.
- একটি পাইথন ফাইলে পরিমাপ করুন:
timeit.timeit()
,timeit.repeat()
- জুপিটার নোটবুক দিয়ে পরিমাপ:
%timeit
,%%timeit
আরেকটি উপায় হল প্রোগ্রামে অতিবাহিত সময় পরিমাপ করতে time.time() ব্যবহার করা।
পাইথন ফাইলে পরিমাপ: timeit.timeit(), timeit.repeat()
উদাহরণ হিসাবে, আমরা একটি সাধারণ ফাংশনের প্রক্রিয়াকরণের সময় পরিমাপ করব, পরীক্ষা(n), যা n ধারাবাহিক সংখ্যার যোগফল গণনা করে।
import timeit
def test(n):
return sum(range(n))
n = 10000
loop = 1000
result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842
আপনি timeit.timeit() ফাংশনে স্ট্রিং হিসাবে যে কোডটি পরিমাপ করতে চান তা পাস করলে, এটি NUMBER বার কার্যকর করা হবে এবং এটি যে সময় নিয়েছে তা ফেরত দেওয়া হবে।
সংখ্যার ডিফল্ট মান হল 1,000,000৷ মনে রাখবেন যে আপনি যদি একটি সময়-সাপেক্ষ প্রক্রিয়ার জন্য ডিফল্ট মান ব্যবহার করেন তবে এটি অনেক সময় নেবে।
আর্গুমেন্ট গ্লোবাল হিসাবে globals() পাস করার মাধ্যমে, কোডটি বিশ্বব্যাপী নামস্থানে কার্যকর করা হবে।
এটি ছাড়া, ফাংশন পরীক্ষা এবং ভেরিয়েবল n উপরের উদাহরণে স্বীকৃত নয়।
নির্দিষ্ট করা কোডটি একটি স্ট্রিংয়ের পরিবর্তে একটি কলযোগ্য বস্তু হতে পারে, তাই এটি কোনো যুক্তি ছাড়াই ল্যাম্বডা এক্সপ্রেশন হিসাবে নির্দিষ্ট করা যেতে পারে; এই ক্ষেত্রে, আর্গুমেন্ট গ্লোবাল নির্দিষ্ট করার প্রয়োজন নেই।
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
ফলাফলের একক সেকেন্ড। এখানে, আউটপুট হল প্রতি নির্বাহের প্রক্রিয়াকরণের সময়কে মৃত্যুদন্ডের সংখ্যা দ্বারা ভাগ করে।
আপনি যদি ভাগ না করেন, ফলাফলের মানটি সহজভাবে বড় হয়ে যাবে কারণ আপনি মৃত্যুদণ্ডের সংখ্যা বাড়াবেন।
print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038
timeit.repeat() ফাংশন ব্যবহার করে, timeit() বারবার চালানো যায়। ফলাফল একটি তালিকা হিসাবে প্রাপ্ত করা হবে.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
জুপিটার নোটবুক দিয়ে পরিমাপ:%timeit, %%timeit
জুপিটার নোটবুকে (আইপিথন), আপনি নিম্নলিখিত ম্যাজিক কমান্ডগুলি ব্যবহার করতে পারেন; timeit মডিউল আমদানি করার কোন প্রয়োজন নেই।
%timeit
%%timeit
% সময়
%timeit-এ, কমান্ড লাইন আর্গুমেন্টের মতো স্পেস দিয়ে আলাদা করা টার্গেট কোড উল্লেখ করুন।
ডিফল্টরূপে, timeit.timeit() এ সংখ্যা এবং পুনরাবৃত্তি স্বয়ংক্রিয়ভাবে নির্ধারিত হয়। আপনি -n এবং -r বিকল্পগুলির সাথে তাদের নির্দিষ্ট করতে পারেন।
ফলাফলগুলি গড় এবং মানক বিচ্যুতি হিসাবে গণনা করা হয়।
%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
%% সময়
ম্যাজিক কমান্ড %%timeit একটি সম্পূর্ণ সেলের প্রক্রিয়াকরণের সময় পরিমাপ করতে ব্যবহার করা যেতে পারে।
একটি উদাহরণ হিসাবে, NumPy ব্যবহার করে একই প্রক্রিয়া চালানো যাক। -n এবং -r বিকল্পগুলি বাদ দেওয়া যেতে পারে।
যেহেতু আমরা পুরো কক্ষের প্রক্রিয়াকরণের সময় পরিমাপ করি, নিম্নলিখিত উদাহরণে NumPy আমদানি করার সময় অন্তর্ভুক্ত রয়েছে।
%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
%%timeit এর জন্য একটি আর্গুমেন্ট হিসাবে লক্ষ্য কোড নির্দিষ্ট করার কোন প্রয়োজন নেই। আপনাকে যা করতে হবে তা হল একটি ঘরের শুরুতে %%timeit লিখতে হবে, তাই এটি ব্যবহার করা সবচেয়ে সহজ।