ដោយប្រើម៉ូឌុល timeit នៃបណ្ណាល័យស្តង់ដារ Python អ្នកអាចវាស់វែងបានយ៉ាងងាយស្រួលនូវពេលវេលាប្រតិបត្តិនៃដំណើរការនៅក្នុងកូដរបស់អ្នក។ វាមានប្រយោជន៍សម្រាប់ការត្រួតពិនិត្យរហ័ស។
ករណីពីរខាងក្រោមនឹងត្រូវបានពិភាក្សានៅទីនេះ។
- វាស់វែងក្នុងឯកសារ Python៖
timeit.timeit()
,timeit.repeat()
- ការវាស់វែងជាមួយសៀវភៅ Jupyter៖
%timeit
,%%timeit
វិធីមួយទៀតគឺប្រើ time.time() ដើម្បីវាស់ពេលវេលាដែលកន្លងផុតទៅក្នុងកម្មវិធី។
ការវាស់វែងនៅក្នុងឯកសារ Python៖ timeit.timeit(), timeit.repeat()
ជាឧទាហរណ៍ យើងនឹងវាស់ពេលវេលាដំណើរការនៃមុខងារសាមញ្ញ test(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() ជា argument globals កូដនឹងត្រូវបានប្រតិបត្តិក្នុង namespace សកល។
បើគ្មាននេះទេ ការធ្វើតេស្តមុខងារ និងអថេរ n មិនត្រូវបានទទួលស្គាល់ក្នុងឧទាហរណ៍ខាងលើទេ។
កូដដែលត្រូវបញ្ជាក់អាចជាវត្ថុដែលអាចហៅបានជំនួសឱ្យខ្សែអក្សរ ដូច្នេះវាអាចត្រូវបានបញ្ជាក់ជាកន្សោម lambda ដោយគ្មានអាគុយម៉ង់។ ក្នុងករណីនេះ អាគុយម៉ង់សកលមិនចាំបាច់បញ្ជាក់ទេ។
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]
ការវាស់វែងជាមួយសៀវភៅ Jupyter៖%timeit, %%timeit
នៅក្នុង Jupyter Notebook (IPython) អ្នកអាចប្រើពាក្យបញ្ជាវេទមន្តខាងក្រោម។ មិនចាំបាច់នាំចូលម៉ូឌុលពេលវេលាទេ។
%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 នៅដើមក្រឡា ដូច្នេះវាងាយស្រួលប្រើបំផុត។