{"id":117702,"date":"2026-05-12T18:09:16","date_gmt":"2026-05-12T12:39:16","guid":{"rendered":"https:\/\/www.mygreatlearning.com\/blog\/?page_id=117702"},"modified":"2026-05-12T17:57:35","modified_gmt":"2026-05-12T12:27:35","slug":"python-program-function-timer-decorator","status":"publish","type":"page","link":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/","title":{"rendered":"Python Program Function Timer Decorator"},"content":{"rendered":"\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.16\/codemirror.min.css\" \/>\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.16\/theme\/eclipse.min.css\" \/>\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\">\n\n<style>\n    .py-decorator-wrapper {\n        --py-bg-app: #f9fafb;\n        --py-bg-panel: #ffffff;\n        --py-border: #e5e7eb;\n        --py-text-primary: #1f2937;\n        --py-text-secondary: #6b7280;\n        --py-primary-blue: #2563eb;\n        --py-primary-hover: #1d4ed8;\n        --py-header-height: 50px;\n        --py-footer-height: 60px;\n\n        font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n        background-color: var(--py-bg-app);\n        color: var(--py-text-primary);\n        width: 100%;\n        border: 1px solid var(--py-border);\n        box-sizing: border-box;\n        display: flex;\n        flex-direction: column;\n        min-height: 85vh;\n    }\n\n    .py-decorator-wrapper * { box-sizing: border-box; }\n\n    .py-decorator-top-nav {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        height: var(--py-header-height);\n        padding: 0 20px;\n        background: var(--py-bg-panel);\n        border-bottom: 1px solid var(--py-border);\n        min-width: 100%;\n    }\n    .py-decorator-nav-title { font-weight: 600; color: var(--py-text-secondary); font-size: 14px; }\n\n    .py-decorator-ide-container {\n        display: flex;\n        flex: 1;\n        height: auto;\n        min-width: 100%;\n        background: white;\n        overflow: hidden;\n    }\n\n    .py-decorator-left-pane {\n        width: 45%;\n        border-right: 1px solid var(--py-border);\n        background: var(--py-bg-panel);\n        display: flex;\n        flex-direction: column;\n    }\n\n    .py-decorator-tabs-header {\n        height: var(--py-header-height);\n        border-bottom: 1px solid var(--py-border);\n        display: flex;\n        align-items: center;\n        padding: 0 20px;\n        gap: 25px;\n        font-size: 14px;\n        font-weight: 500;\n        color: var(--py-text-secondary);\n    }\n\n    .py-decorator-tab-item { cursor: pointer; padding: 14px 0; border-bottom: 2px solid transparent; }\n    .py-decorator-tab-item.active { color: var(--py-text-primary); border-bottom-color: var(--py-primary-blue); }\n    .py-decorator-tab-item:hover { color: var(--py-text-primary); }\n\n    .py-decorator-pane-content { flex: 1; overflow-y: auto; padding: 25px; display: none; }\n    .py-decorator-pane-content.active { display: block; }\n\n    .py-decorator-wrapper h1 { margin-top: 0; font-size: 22px; font-weight: 600; color: var(--py-text-primary); margin-bottom: 1rem; }\n    .py-decorator-wrapper p { line-height: 1.6; color: #374151; margin-bottom: 1rem; }\n    .py-decorator-wrapper ul { margin-bottom: 20px; color: #374151; line-height: 1.6; padding-left: 20px; }\n    .py-decorator-wrapper li { margin-bottom: 5px; }\n    .py-decorator-wrapper h3 { font-size: 16px; margin-top: 15px; margin-bottom: 10px; }\n\n    .py-decorator-solution-block {\n        background: #f8f9fa; border: 1px solid var(--py-border); padding: 15px;\n        border-radius: 6px; font-family: 'Consolas', monospace; font-size: 14px;\n        color: #333; white-space: pre-wrap; overflow-x: auto;\n    }\n\n    .py-decorator-sample-box { background-color: #f3f4f6; border: 1px solid var(--py-border); border-radius: 6px; margin-top: 20px; overflow: hidden; }\n    .py-decorator-sample-header { display: flex; background-color: #e5e7eb; font-size: 13px; font-weight: 600; color: var(--py-text-primary); }\n    .py-decorator-sample-col-title { width: 50%; padding: 8px 15px; border-right: 1px solid #d1d5db; }\n    .py-decorator-sample-col-content { width: 50%; padding: 15px; font-family: 'Consolas', monospace; font-size: 14px; border-right: 1px solid var(--py-border); white-space: pre-wrap; color: #333; }\n    .py-decorator-sample-body { display: flex; }\n\n    .py-decorator-right-pane {\n        width: 55%; display: flex; flex-direction: column; background: var(--py-bg-panel);\n    }\n\n    .py-decorator-editor-top-bar {\n        height: var(--py-header-height); border-bottom: 1px solid var(--py-border);\n        display: flex; align-items: center; justify-content: space-between;\n        padding: 0 15px; background-color: #f9fafb;\n    }\n\n    .py-decorator-lang-label { font-weight: 600; font-size: 14px; background: #e5e7eb; padding: 4px 12px; border-radius: 4px; }\n    .py-decorator-editor-settings i { color: var(--py-text-secondary); margin-left: 15px; cursor: pointer; font-size: 16px; }\n\n    .py-decorator-code-area { flex: 1; display: flex; flex-direction: column; position: relative; }\n    .py-decorator-code-area .CodeMirror { flex: 1; height: 100%; position: absolute; top: 0; bottom: 0; left: 0; right: 0; font-family: 'Source Code Pro', monospace; font-size: 15px; }\n\n    .py-decorator-console-section {\n        border-top: 1px solid var(--py-border); background: #f9fafb;\n        display: flex; flex-direction: column; height: 35%;\n    }\n    .py-decorator-console-header { padding: 8px 15px; background: #e5e7eb; font-size: 12px; font-weight: 600; color: var(--py-text-secondary); text-transform: uppercase; }\n    .py-decorator-console-body { display: flex; flex: 1; overflow: hidden; }\n    .py-decorator-input-wrapper, .py-decorator-output-wrapper { flex: 1; display: flex; flex-direction: column; padding: 10px; border-right: 1px solid var(--py-border); }\n    .py-decorator-output-wrapper { border-right: none; }\n    .py-decorator-console-label { font-size: 12px; font-weight: 600; margin-bottom: 5px; color: var(--py-text-secondary); }\n\n    textarea.py-decorator-custom-input-area { flex: 1; border: 1px solid var(--py-border); border-radius: 4px; resize: none; padding: 8px; font-family: monospace; width: 100%; }\n\n    .py-decorator-output-display {\n        flex: 1; background: white; border: 1px solid var(--py-border);\n        border-radius: 4px; padding: 8px; font-family: monospace;\n        white-space: pre-wrap; overflow-y: auto; font-size: 13px;\n        line-height: 1.15;\n    }\n\n    .py-decorator-footer-actions {\n        height: var(--py-footer-height);\n        border-top: 1px solid var(--py-border);\n        display: flex;\n        align-items: center;\n        justify-content: flex-end;\n        padding: 0 20px;\n        background-color: var(--py-bg-panel);\n    }\n\n    .py-decorator-execution-group { display: flex; gap: 12px; align-items: center; }\n\n    .py-decorator-btn {\n        padding: 8px 20px; border-radius: 4px; font-size: 14px; font-weight: 600;\n        cursor: pointer; text-decoration: none; display: inline-flex; align-items: center;\n        justify-content: center; transition: 0.2s; height: 38px; box-shadow: none; border: none;\n    }\n\n    .py-decorator-btn-secondary { background: transparent; border: 1px solid var(--py-border); color: var(--py-text-primary); }\n    .py-decorator-btn-secondary:hover { background: #f3f4f6; }\n    .py-decorator-btn-primary { background: var(--py-primary-blue); border: 1px solid var(--py-primary-blue); color: white; }\n    .py-decorator-btn-primary:hover { background: var(--py-primary-hover); }\n\n    .py-decorator-spinner {\n        display: none; width: 14px; height: 14px;\n        border: 2px solid #fff; border-top-color: transparent;\n        border-radius: 50%; animation: py-decorator-spin 0.8s linear infinite; margin-left: 8px;\n    }\n    @keyframes py-decorator-spin { 100% { transform: rotate(360deg); } }\n\n    .py-decorator-hidden { display: none !important; }\n    .py-decorator-btn-mobile { display: none !important; }\n\n    @media (max-width: 768px) {\n        .py-decorator-wrapper { display: block; height: auto; min-height: auto; }\n        .py-decorator-ide-container { flex: none; height: auto; }\n        .py-decorator-top-nav { display: none; }\n        .py-decorator-ide-container { flex-direction: column; overflow-y: auto; height: auto; }\n        .py-decorator-left-pane, .py-decorator-right-pane { width: 100%; height: auto; }\n        .py-decorator-left-pane { border-right: none; border-bottom: 8px solid #f3f4f6; min-height: auto; max-height: 400px; }\n        .py-decorator-right-pane { display: flex; flex-direction: column; }\n        .py-decorator-console-section, .py-decorator-console-body, .py-decorator-footer-actions { display: contents; }\n        .py-decorator-console-header { display: none; }\n        .py-decorator-editor-top-bar { order: 1; }\n        .py-decorator-code-area { order: 2; height: 500px; flex: none; }\n        .py-decorator-code-area .CodeMirror { position: relative; height: 500px; }\n        .py-decorator-input-wrapper { order: 3; width: 100%; height: auto; min-height: 280px; border-right: none; border-top: 8px solid #f3f4f6; border-bottom: 1px solid var(--py-border); }\n        .py-decorator-execution-group { order: 4; width: 100%; display: flex; padding: 15px; gap: 10px; border-bottom: 1px solid var(--py-border); background: #fff; }\n        .py-decorator-execution-group .py-decorator-btn { flex: 1; }\n        .py-decorator-output-wrapper { order: 5; width: 100%; height: auto; min-height: 300px; max-height: 500px; border-right: none; background: #fff; }\n        .py-decorator-btn-mobile { display: inline-flex !important; order: 6; width: 48%; margin: 15px 1%; box-sizing: border-box; text-align: center; }\n        a.py-decorator-hidden { display: none !important; }\n    }\n<\/style>\n\n<div class=\"py-decorator-wrapper\">\n    <div class=\"py-decorator-top-nav\">\n        <a id=\"py-decorator-btn-prev-top\" class=\"py-decorator-btn py-decorator-btn-secondary py-decorator-hidden\" href=\"#\">&larr; Previous<\/a>\n        <span class=\"py-decorator-nav-title\">Module 10: Advanced Functional Features<\/span>\n        <a id=\"py-decorator-btn-next-top\" class=\"py-decorator-btn py-decorator-btn-primary py-decorator-hidden\" href=\"#\">Next &rarr;<\/a>\n    <\/div>\n\n    <div class=\"py-decorator-ide-container\" id=\"py-decorator-ideContainer\">\n\n        <div class=\"py-decorator-left-pane\">\n            <div class=\"py-decorator-tabs-header\">\n                <div class=\"py-decorator-tab-item active\" onclick=\"pyDecoratorSwitchTab('statement')\">Statement<\/div>\n                <div class=\"py-decorator-tab-item\" onclick=\"pyDecoratorSwitchTab('solution')\">Solution<\/div>\n            <\/div>\n\n            <div id=\"py-decorator-tab-statement\" class=\"py-decorator-pane-content active\">\n                <h1 id=\"python-exercise-10-3-decorators\">Python Exercise 10.3: Decorators<\/h1>\n                <p>Decorators are a powerful Pythonic feature that let you wrap a function to extend its behaviour without modifying its source code. In this exercise, you will build a <code>@timer<\/code> decorator that measures how long a function takes to execute.<\/p>\n\n                <p>Your program should:<\/p>\n                <ul>\n                    <li>Import the <code>time<\/code> module.<\/li>\n                    <li>Define a <code>timer<\/code> decorator function that accepts a function <code>func<\/code> as its argument.<\/li>\n                    <li>Inside <code>timer<\/code>, define an inner <code>wrapper<\/code> function that:\n                        <ul>\n                            <li>Records the start time using <code>time.time()<\/code>.<\/li>\n                            <li>Calls the original function and stores its return value.<\/li>\n                            <li>Records the end time and computes elapsed time.<\/li>\n                            <li>Prints the elapsed time in the format: <code>Time taken: X.XXXXXX seconds<\/code><\/li>\n                            <li>Returns the original function's return value.<\/li>\n                        <\/ul>\n                    <\/li>\n                    <li>Return <code>wrapper<\/code> from the <code>timer<\/code> function.<\/li>\n                    <li>Apply the <code>@timer<\/code> decorator to a function called <code>slow_sum<\/code> that sums all integers from 1 to 1,000,000 and returns the result.<\/li>\n                    <li>Call <code>slow_sum()<\/code> and print its return value.<\/li>\n                <\/ul>\n\n                <h3 id=\"sample-interaction-success\">Sample Interaction (Success):<\/h3>\n                <div class=\"py-decorator-sample-box\">\n                    <div class=\"py-decorator-sample-header\">\n                        <div class=\"py-decorator-sample-col-title\">Input<\/div>\n                        <div class=\"py-decorator-sample-col-title\">Output<\/div>\n                    <\/div>\n                    <div class=\"py-decorator-sample-body\">\n                        <div class=\"py-decorator-sample-col-content\">(no input required)<\/div>\n                        <div class=\"py-decorator-sample-col-content\">Time taken: 0.045123 seconds\n500000500000<\/div>\n                    <\/div>\n                <\/div>\n\n                <p style=\"margin-top:16px\"><strong>Note:<\/strong> The exact elapsed time will vary depending on the machine. Your output just needs to print the time in the correct format followed by the sum on the next line.<\/p>\n            <\/div>\n\n            <div id=\"py-decorator-tab-solution\" class=\"py-decorator-pane-content\">\n                <h1 id=\"solution\">Solution<\/h1>\n                <p>The <code>timer<\/code> decorator wraps any function using an inner <code>wrapper<\/code> function. It records timestamps before and after the call to compute elapsed time, then returns the original result unchanged.<\/p>\n                <div class=\"py-decorator-solution-block\">import time\n\ndef timer(func):\n    def wrapper(*args, **kwargs):\n        start = time.time()\n        result = func(*args, **kwargs)\n        end = time.time()\n        elapsed = end - start\n        print(f\"Time taken: {elapsed:.6f} seconds\")\n        return result\n    return wrapper\n\n@timer\ndef slow_sum():\n    return sum(range(1, 1_000_001))\n\nprint(slow_sum())<\/div>\n\n                <p style=\"margin-top:20px\"><strong>Key Concepts:<\/strong><\/p>\n                <ul>\n                    <li>A <strong>decorator<\/strong> is a function that takes another function as input and returns a new function (the wrapper).<\/li>\n                    <li><code>@timer<\/code> above a function definition is syntactic sugar for <code>slow_sum = timer(slow_sum)<\/code>.<\/li>\n                    <li><code>*args, **kwargs<\/code> in the wrapper ensures the decorator works with any function signature.<\/li>\n                    <li><code>time.time()<\/code> returns the current time as a float of seconds since the epoch; subtracting start from end gives elapsed time.<\/li>\n                    <li>Returning <code>result<\/code> from <code>wrapper<\/code> preserves the decorated function's original return value.<\/li>\n                    <li><code>sum(range(1, 1_000_001))<\/code> efficiently sums integers from 1 to 1,000,000 using Python's built-in functions.<\/li>\n                <\/ul>\n            <\/div>\n        <\/div>\n\n        <div class=\"py-decorator-right-pane\">\n            <div class=\"py-decorator-editor-top-bar\">\n                <span class=\"py-decorator-lang-label\">Python 3<\/span>\n                <div class=\"py-decorator-editor-settings\">\n                    <i class=\"fas fa-expand\" id=\"py-decorator-fullscreenBtn\" title=\"Toggle Fullscreen\"><\/i>\n                <\/div>\n            <\/div>\n\n            <div class=\"py-decorator-code-area\">\n                <div id=\"py-decorator-code-editor-div\"><\/div>\n            <\/div>\n\n            <div class=\"py-decorator-console-section\">\n                <div class=\"py-decorator-console-header\">Test Console<\/div>\n                <div class=\"py-decorator-console-body\">\n                    <div class=\"py-decorator-input-wrapper\">\n                        <label class=\"py-decorator-console-label\">Custom Input (Stdin)<\/label>\n                        <textarea id=\"py-decorator-custom-input\" class=\"py-decorator-custom-input-area\" placeholder=\"No input required for this exercise\"><\/textarea>\n                    <\/div>\n                    <div class=\"py-decorator-output-wrapper\">\n                        <label class=\"py-decorator-console-label\">Output<\/label>\n                        <div id=\"py-decorator-output-console\" class=\"py-decorator-output-display\">Run code to see output...<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"py-decorator-footer-actions\">\n                <a id=\"py-decorator-btn-prev-mobile\" class=\"py-decorator-btn py-decorator-btn-secondary py-decorator-hidden py-decorator-btn-mobile\" href=\"#\">&larr; Previous<\/a>\n\n                <div class=\"py-decorator-execution-group\">\n                    <button class=\"py-decorator-btn py-decorator-btn-secondary\" onclick=\"pyDecoratorResetCode()\">Reset<\/button>\n                    <button class=\"py-decorator-btn py-decorator-btn-primary\" onclick=\"pyDecoratorRunCode()\">\n                        <span id=\"py-decorator-btn-text\">Run Code<\/span>\n                        <span class=\"py-decorator-spinner\" id=\"py-decorator-btn-spinner\"><\/span>\n                    <\/button>\n                <\/div>\n\n                <a id=\"py-decorator-btn-next-mobile\" class=\"py-decorator-btn py-decorator-btn-primary py-decorator-hidden py-decorator-btn-mobile\" href=\"#\">Next &rarr;<\/a>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.16\/codemirror.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.16\/mode\/python\/python.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/codemirror\/5.65.16\/addon\/edit\/closebrackets.min.js\"><\/script>\n\n<script>\n    var pyDecoratorEditor;\n    var pyDecoratorStarterCode;\n\n    const pyDecoratorPrevLink = \"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-lambda-sorting\";\n    const pyDecoratorNextLink = \"\";\n\n    document.addEventListener(\"DOMContentLoaded\", function() {\n        const prevBtnTop = document.getElementById('py-decorator-btn-prev-top');\n        const nextBtnTop = document.getElementById('py-decorator-btn-next-top');\n        const prevBtnMobile = document.getElementById('py-decorator-btn-prev-mobile');\n        const nextBtnMobile = document.getElementById('py-decorator-btn-next-mobile');\n\n        if (pyDecoratorPrevLink && pyDecoratorPrevLink.trim() !== \"\") {\n            prevBtnTop.href = pyDecoratorPrevLink;\n            prevBtnMobile.href = pyDecoratorPrevLink;\n            prevBtnTop.classList.remove('py-decorator-hidden');\n            prevBtnMobile.classList.remove('py-decorator-hidden');\n        }\n\n        if (pyDecoratorNextLink && pyDecoratorNextLink.trim() !== \"\") {\n            nextBtnTop.href = pyDecoratorNextLink;\n            nextBtnMobile.href = pyDecoratorNextLink;\n            nextBtnTop.classList.remove('py-decorator-hidden');\n            nextBtnMobile.classList.remove('py-decorator-hidden');\n        }\n    });\n\n    function pyDecoratorSwitchTab(tabName) {\n        document.querySelectorAll('#py-decorator-tab-statement, #py-decorator-tab-solution').forEach(el => el.classList.remove('active'));\n        const headerTabs = document.querySelector('#py-decorator-ideContainer .py-decorator-tabs-header').children;\n        Array.from(headerTabs).forEach(el => el.classList.remove('active'));\n        document.getElementById('py-decorator-tab-' + tabName).classList.add('active');\n        if (tabName === 'statement') headerTabs[0].classList.add('active');\n        if (tabName === 'solution') headerTabs[1].classList.add('active');\n    }\n\n    const pyDecoratorFullscreenBtn = document.getElementById('py-decorator-fullscreenBtn');\n    const pyDecoratorIdeContainer = document.getElementById('py-decorator-ideContainer');\n\n    if (pyDecoratorFullscreenBtn) {\n        pyDecoratorFullscreenBtn.addEventListener('click', () => {\n            if (!document.fullscreenElement) {\n                pyDecoratorIdeContainer.requestFullscreen().catch(err => alert(`Error: ${err.message}`));\n                pyDecoratorFullscreenBtn.classList.replace('fa-expand', 'fa-compress');\n            } else {\n                document.exitFullscreen();\n                pyDecoratorFullscreenBtn.classList.replace('fa-compress', 'fa-expand');\n            }\n        });\n    }\n\n    pyDecoratorStarterCode = `# Exercise 10.3: Decorators\n# Build a @timer decorator that measures a function's execution time\n\nimport time\n\n# Step 1: Define the timer decorator\n# def timer(func):\n\n    # Step 2: Define the wrapper function inside timer\n    # def wrapper(*args, **kwargs):\n\n        # Record start time\n\n\n        # Call the original function and store result\n\n\n        # Record end time and compute elapsed time\n\n\n        # Print elapsed time in format: Time taken: X.XXXXXX seconds\n\n\n        # Return the original result\n\n\n    # Step 3: Return wrapper from timer\n\n\n# Step 4: Apply @timer decorator to slow_sum\n# @timer\n# def slow_sum():\n    # Return the sum of all integers from 1 to 1,000,000\n\n\n# Step 5: Call slow_sum() and print the result\n\n`;\n\n    pyDecoratorEditor = CodeMirror(document.getElementById(\"py-decorator-code-editor-div\"), {\n        value: pyDecoratorStarterCode,\n        mode: \"python\",\n        theme: \"eclipse\",\n        lineNumbers: true,\n        indentUnit: 4,\n        autoCloseBrackets: true\n    });\n\n    function pyDecoratorResetCode() {\n        pyDecoratorEditor.setValue(pyDecoratorStarterCode);\n        document.getElementById(\"py-decorator-output-console\").innerText = \"Run code to see output...\";\n    }\n\n    function pyDecoratorRunCode() {\n        const spinner = document.getElementById('py-decorator-btn-spinner');\n        const btnText = document.getElementById('py-decorator-btn-text');\n        const outputBox = document.getElementById('py-decorator-output-console');\n\n        spinner.style.display = \"inline-block\";\n        btnText.innerText = \"Running \";\n        outputBox.innerText = \"Processing...\";\n        outputBox.style.color = \"#6b7280\";\n\n        const pythonCode = pyDecoratorEditor.getValue();\n        const userInput = document.getElementById(\"py-decorator-custom-input\").value;\n\n        fetch(\"https:\/\/blogsupport123-python-compiler.hf.space\/api\/run-python\", {\n            method: \"POST\",\n            headers: { \"Content-Type\": \"application\/json\" },\n            body: JSON.stringify({ code: pythonCode, input: userInput }),\n        })\n        .then(response => response.json())\n        .then(data => {\n            if (data.output) {\n                outputBox.innerText = data.output;\n                outputBox.style.color = \"#1f2937\";\n            } else if (data.error || data.errors) {\n                outputBox.innerText = data.error || data.errors;\n                outputBox.style.color = \"#ef4444\";\n            } else {\n                outputBox.innerText = \"No output returned.\";\n            }\n        })\n        .catch(err => {\n            outputBox.innerText = \"Error: \" + err.message;\n            outputBox.style.color = \"#ef4444\";\n        })\n        .finally(() => {\n            spinner.style.display = \"none\";\n            btnText.innerText = \"Run Code\";\n        });\n    }\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>&larr; Previous Module 10: Advanced Functional Features Next &rarr; Statement Solution Python Exercise 10.3: Decorators Decorators are a powerful Pythonic feature that let you wrap a function to extend its behaviour without modifying its source code. In this exercise, you will build a @timer decorator that measures how long a function takes to execute. Your [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":0,"parent":114145,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[25860],"tags":[36796,36895],"class_list":["post-117702","page","type-page","status-publish","hentry","category-software","tag-python","tag-python-exercise"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Python Program Function Timer Decorator - Great Learning Blog: Free Resources what Matters to shape your Career!<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Python Program Function Timer Decorator\" \/>\n<meta property=\"og:description\" content=\"&larr; Previous Module 10: Advanced Functional Features Next &rarr; Statement Solution Python Exercise 10.3: Decorators Decorators are a powerful Pythonic feature that let you wrap a function to extend its behaviour without modifying its source code. In this exercise, you will build a @timer decorator that measures how long a function takes to execute. Your [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/\" \/>\n<meta property=\"og:site_name\" content=\"Great Learning Blog: Free Resources what Matters to shape your Career!\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/GreatLearningOfficial\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@Great_Learning\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/python-program-function-timer-decorator\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/python-program-function-timer-decorator\\\/\"},\"author\":{\"name\":\"Great Learning Editorial Team\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#\\\/schema\\\/person\\\/6f993d1be4c584a335951e836f2656ad\"},\"headline\":\"Python Program Function Timer Decorator\",\"datePublished\":\"2026-05-12T12:39:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/python-program-function-timer-decorator\\\/\"},\"wordCount\":353,\"publisher\":{\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#organization\"},\"keywords\":[\"python\",\"python-exercise\"],\"articleSection\":[\"IT\\\/Software Development\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/python-program-function-timer-decorator\\\/\",\"url\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/python-program-function-timer-decorator\\\/\",\"name\":\"Python Program Function Timer Decorator - Great Learning Blog: Free Resources what Matters to shape your Career!\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-05-12T12:39:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/python-program-function-timer-decorator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/python-program-function-timer-decorator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/python-program-function-timer-decorator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python Exercises\",\"item\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/python-exercise\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Python Program Function Timer Decorator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/\",\"name\":\"Great Learning Blog\",\"description\":\"Learn, Upskill &amp; Career Development Guide and Resources\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#organization\"},\"alternateName\":\"Great Learning\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#organization\",\"name\":\"Great Learning\",\"url\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/GL-Logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/GL-Logo.jpg\",\"width\":900,\"height\":900,\"caption\":\"Great Learning\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/GreatLearningOfficial\\\/\",\"https:\\\/\\\/x.com\\\/Great_Learning\",\"https:\\\/\\\/www.instagram.com\\\/greatlearningofficial\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/school\\\/great-learning\\\/\",\"https:\\\/\\\/in.pinterest.com\\\/greatlearning12\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/beaconelearning\\\/\"],\"description\":\"Great Learning is a leading global ed-tech company for professional training and higher education. It offers comprehensive, industry-relevant, hands-on learning programs across various business, technology, and interdisciplinary domains driving the digital economy. These programs are developed and offered in collaboration with the world's foremost academic institutions.\",\"email\":\"info@mygreatlearning.com\",\"legalName\":\"Great Learning Education Services Pvt. Ltd\",\"foundingDate\":\"2013-11-29\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"1001\",\"maxValue\":\"5000\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/#\\\/schema\\\/person\\\/6f993d1be4c584a335951e836f2656ad\",\"name\":\"Great Learning Editorial Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/unnamed.webp\",\"url\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/unnamed.webp\",\"contentUrl\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/unnamed.webp\",\"caption\":\"Great Learning Editorial Team\"},\"description\":\"The Great Learning Editorial Staff includes a dynamic team of subject matter experts, instructors, and education professionals who combine their deep industry knowledge with innovative teaching methods. Their mission is to provide learners with the skills and insights needed to excel in their careers, whether through upskilling, reskilling, or transitioning into new fields.\",\"sameAs\":[\"https:\\\/\\\/www.mygreatlearning.com\\\/\",\"https:\\\/\\\/in.linkedin.com\\\/school\\\/great-learning\\\/\",\"https:\\\/\\\/x.com\\\/https:\\\/\\\/twitter.com\\\/Great_Learning\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCObs0kLIrDjX2LLSybqNaEA\"],\"award\":[\"Best EdTech Company of the Year 2024\",\"Education Economictimes Outstanding Education\\\/Edtech Solution Provider of the Year 2024\",\"Leading E-learning Platform 2024\"],\"url\":\"https:\\\/\\\/www.mygreatlearning.com\\\/blog\\\/author\\\/greatlearning\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python Program Function Timer Decorator - Great Learning Blog: Free Resources what Matters to shape your Career!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/","og_locale":"en_US","og_type":"article","og_title":"Python Program Function Timer Decorator","og_description":"&larr; Previous Module 10: Advanced Functional Features Next &rarr; Statement Solution Python Exercise 10.3: Decorators Decorators are a powerful Pythonic feature that let you wrap a function to extend its behaviour without modifying its source code. In this exercise, you will build a @timer decorator that measures how long a function takes to execute. Your [&hellip;]","og_url":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/","og_site_name":"Great Learning Blog: Free Resources what Matters to shape your Career!","article_publisher":"https:\/\/www.facebook.com\/GreatLearningOfficial\/","twitter_card":"summary_large_image","twitter_site":"@Great_Learning","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/#article","isPartOf":{"@id":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/"},"author":{"name":"Great Learning Editorial Team","@id":"https:\/\/www.mygreatlearning.com\/blog\/#\/schema\/person\/6f993d1be4c584a335951e836f2656ad"},"headline":"Python Program Function Timer Decorator","datePublished":"2026-05-12T12:39:16+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/"},"wordCount":353,"publisher":{"@id":"https:\/\/www.mygreatlearning.com\/blog\/#organization"},"keywords":["python","python-exercise"],"articleSection":["IT\/Software Development"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/","url":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/","name":"Python Program Function Timer Decorator - Great Learning Blog: Free Resources what Matters to shape your Career!","isPartOf":{"@id":"https:\/\/www.mygreatlearning.com\/blog\/#website"},"datePublished":"2026-05-12T12:39:16+00:00","breadcrumb":{"@id":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/python-program-function-timer-decorator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog","item":"https:\/\/www.mygreatlearning.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Python Exercises","item":"https:\/\/www.mygreatlearning.com\/blog\/python-exercise\/"},{"@type":"ListItem","position":3,"name":"Python Program Function Timer Decorator"}]},{"@type":"WebSite","@id":"https:\/\/www.mygreatlearning.com\/blog\/#website","url":"https:\/\/www.mygreatlearning.com\/blog\/","name":"Great Learning Blog","description":"Learn, Upskill &amp; Career Development Guide and Resources","publisher":{"@id":"https:\/\/www.mygreatlearning.com\/blog\/#organization"},"alternateName":"Great Learning","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mygreatlearning.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.mygreatlearning.com\/blog\/#organization","name":"Great Learning","url":"https:\/\/www.mygreatlearning.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mygreatlearning.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.mygreatlearning.com\/blog\/wp-content\/uploads\/2022\/06\/GL-Logo.jpg","contentUrl":"https:\/\/www.mygreatlearning.com\/blog\/wp-content\/uploads\/2022\/06\/GL-Logo.jpg","width":900,"height":900,"caption":"Great Learning"},"image":{"@id":"https:\/\/www.mygreatlearning.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/GreatLearningOfficial\/","https:\/\/x.com\/Great_Learning","https:\/\/www.instagram.com\/greatlearningofficial\/","https:\/\/www.linkedin.com\/school\/great-learning\/","https:\/\/in.pinterest.com\/greatlearning12\/","https:\/\/www.youtube.com\/user\/beaconelearning\/"],"description":"Great Learning is a leading global ed-tech company for professional training and higher education. It offers comprehensive, industry-relevant, hands-on learning programs across various business, technology, and interdisciplinary domains driving the digital economy. These programs are developed and offered in collaboration with the world's foremost academic institutions.","email":"info@mygreatlearning.com","legalName":"Great Learning Education Services Pvt. Ltd","foundingDate":"2013-11-29","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"1001","maxValue":"5000"}},{"@type":"Person","@id":"https:\/\/www.mygreatlearning.com\/blog\/#\/schema\/person\/6f993d1be4c584a335951e836f2656ad","name":"Great Learning Editorial Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mygreatlearning.com\/blog\/wp-content\/uploads\/2022\/02\/unnamed.webp","url":"https:\/\/www.mygreatlearning.com\/blog\/wp-content\/uploads\/2022\/02\/unnamed.webp","contentUrl":"https:\/\/www.mygreatlearning.com\/blog\/wp-content\/uploads\/2022\/02\/unnamed.webp","caption":"Great Learning Editorial Team"},"description":"The Great Learning Editorial Staff includes a dynamic team of subject matter experts, instructors, and education professionals who combine their deep industry knowledge with innovative teaching methods. Their mission is to provide learners with the skills and insights needed to excel in their careers, whether through upskilling, reskilling, or transitioning into new fields.","sameAs":["https:\/\/www.mygreatlearning.com\/","https:\/\/in.linkedin.com\/school\/great-learning\/","https:\/\/x.com\/https:\/\/twitter.com\/Great_Learning","https:\/\/www.youtube.com\/channel\/UCObs0kLIrDjX2LLSybqNaEA"],"award":["Best EdTech Company of the Year 2024","Education Economictimes Outstanding Education\/Edtech Solution Provider of the Year 2024","Leading E-learning Platform 2024"],"url":"https:\/\/www.mygreatlearning.com\/blog\/author\/greatlearning\/"}]}},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"web-stories-poster-portrait":false,"web-stories-publisher-logo":false,"web-stories-thumbnail":false},"uagb_author_info":{"display_name":"Great Learning Editorial Team","author_link":"https:\/\/www.mygreatlearning.com\/blog\/author\/greatlearning\/"},"uagb_comment_info":0,"uagb_excerpt":"&larr; Previous Module 10: Advanced Functional Features Next &rarr; Statement Solution Python Exercise 10.3: Decorators Decorators are a powerful Pythonic feature that let you wrap a function to extend its behaviour without modifying its source code. In this exercise, you will build a @timer decorator that measures how long a function takes to execute. Your&hellip;","_links":{"self":[{"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/pages\/117702","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/comments?post=117702"}],"version-history":[{"count":1,"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/pages\/117702\/revisions"}],"predecessor-version":[{"id":117708,"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/pages\/117702\/revisions\/117708"}],"up":[{"embeddable":true,"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/pages\/114145"}],"wp:attachment":[{"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/media?parent=117702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/categories?post=117702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mygreatlearning.com\/blog\/wp-json\/wp\/v2\/tags?post=117702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}