ویژگی تصویر

کتابخانه time در پایتون — مروری کامل و کاربردی

  /  پایتون   /  کتابخانه time در پایتون
بنر تبلیغاتی الف

کتابخانهٔ استاندارد time در پایتون ابزارهایی ساده اما قدرتمند برای کار با زمان، خواب‌کردن برنامه، اندازه‌گیری زمان اجرای قطعات کد و تبدیل بین قلمروهای زمانی فراهم می‌کند. در این مقاله، توابع اصلی، نکات حرفه‌ای، مثال‌های عملی و مقایسه با ماژول‌های مرتبط مانند datetime و timeit را بررسی می‌کنیم.

چرا از time استفاده کنیم؟

  • برای گرفتن زمان جاری و timestampها (ثانیه از مبدأ).
  • برای خواباندن برنامه با دقت معقول (sleep).
  • برای اندازه‌گیری زمان اجرا (perf_counter، process_time، monotonic).
  • برای تبدیل بین ساختارهای زمانی و رشته‌های قابل خواندن.

توابع مهم و معنای آنها

تابعکارکرد
time()بازگرداندن timestamp (ثانیه از epoch)
sleep(secs)توقف برنامه به میزان secs ثانیه
localtime()/gmtime()تبدیل timestamp به زمان محلی یا UTC در قالب struct_time
strftime()/strptime()تبدیل بین struct_time و رشته با فرمت دلخواه
mktime()تبدیل struct_time محلی به timestamp
perf_counter()ساعت با رزولوشن بالا برای اندازه‌گیری زمان گذشته
process_time()زمان CPU مصرف شده توسط فرایند
monotonic()ساعت صعودی که به عقب برنمی‌گردد (مناسب timeout)

مثال‌های پایه

import time

# گرفتن timestamp جاری
ts = time.time()
print("Timestamp:", ts)

# تبدیل به زمان محلی قابل خواندن
lt = time.localtime(ts)
print("Local time:", time.strftime("%Y-%m-%d %H:%M:%S", lt))

# خواب به مدت 1.5 ثانیه
time.sleep(1.5)

در این قطعه ابتدا timestamp جاری از طریق time.time() گرفته می‌شود. سپس با time.localtime() آن را به یک ساختار قابل خواندن تبدیل کرده و با time.strftime() به رشته‌ای با فرمت سال-ماه-روز ساعت:دقیقه:ثانیه تبدیل می‌کنیم. در پایان برنامه 1.5 ثانیه متوقف می‌شود. دقت کنید که sleep دقیقتی سطح سیستم‌عامل دارد و نمی‌توان انتظار دقت نانوثانیه‌ای داشت.

اندازه‌گیری زمان اجرا — کدام تابع را انتخاب کنیم؟

  • time.perf_counter(): بهترین گزینه برای اندازه‌گیری مدت زمان واقعی (wall-clock) با رزولوشن بالا.
  • time.process_time(): زمان CPU مصرف‌شده توسط برنامه؛ برای مقایسه مصرف پردازنده مناسب است.
  • time.monotonic(): وقتی نیاز به ساعتی داریم که به عقب برنگردد (مثل timeout یا retry).
import time

start = time.perf_counter()
# کدی که می‌خواهیم اندازه‌گیری کنیم
sum_val = sum(range(10_000_000))
end = time.perf_counter()
print("Elapsed (perf_counter):", end - start)

در این مثال از perf_counter برای اندازه‌گیری زمان اجرای جمع اعداد تا 10 میلیون استفاده شده است. نتیجهٔ بدست‌آمده دقیق‌تر و قابل‌اطمینان‌تر از time.time برای کاربردهای بنچمارکینگ است، زیرا رزولوشن بالاتری دارد و تحت نوسانات سیستم کمتر قرار می‌گیرد.

الگوی خوب: دکوراتور برای زمان‌گیری

import time
from functools import wraps

def timed(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} took {end - start:.6f} seconds")
        return result
    return wrapper

@timed
def compute():
    return sum(range(1000000))

compute()

این دکوراتور به‌صورت عمومی برای دقت بالا از perf_counter استفاده می‌کند. با اعمال دکوراتور روی هر تابع، زمان اجرای آن چاپ می‌شود. استفاده از دکوراتور ساده و تمیز است و به شما امکان می‌دهد بدون تغییر منطق توابع، بنچمارک ساده داشته باشید.

تبدیل رشتهٔ زمانی به timestamp و بالعکس

import time

timestr = "2025-10-31 14:30:00"
struct_time = time.strptime(timestr, "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(struct_time)
print("Timestamp:", timestamp)
print("Back to string:", time.strftime("%c", time.localtime(timestamp)))

در این قطعه، با strptime یک رشتهٔ زمانی مطابق فرمت مشخص به struct_time تبدیل می‌شود و سپس با mktime به timestamp محلی تبدیل می‌گردد. در انتها مجدداً با strftime نمایش قابل‌خواندن ساخته می‌شود. توجه داشته باشید که mktime زمان محلی را در نظر می‌گیرد و برای مدیریت دقیق‌تر مناطق زمانی بهتر است از ماژول datetime و کتابخانه‌های TZ محور مانند pytz یا zoneinfo استفاده کنید.

نکات حرفه‌ای و پیشنهادات

  • برای اندازه‌گیری مدت‌زمان اجرای کدهای کوتاه، از timeit استفاده کنید تا اثر JIT و startup کاسته شود.
  • به جای time.time() برای بنچمارک استفاده نکنید؛ perf_counter بهتر است.
  • برای timeout در حلقه‌ها از time.monotonic() استفاده کنید تا تغییرات ساعت سیستمی تأثیری نداشته باشد.
  • برای نمایش و تبدیل زمان با timezone از datetime همراه با zoneinfo (پایتون 3.9+) بهره ببرید.
  • دقت sleep به فاکتورهای سیستم‌عاملی بستگی دارد؛ در برنامه‌های شبکه‌ای یا asyncio از asyncio.sleep استفاده کنید.

الگوی timeout امن با monotonic

import time

def wait_for(condition_func, timeout):
    start = time.monotonic()
    while True:
        if condition_func():
            return True
        if time.monotonic() - start > timeout:
            return False
        time.sleep(0.01)

این الگو از monotonic برای جلوگیری از مشکلات ناشی از تغییر ساعت سیستم استفاده می‌کند. حلقه هر 0.01 ثانیه شرط را بررسی کرده و اگر بیش از timeout گذشته باشد، خاتمه می‌دهد. استفاده از sleep کوتاه برای کاهش بار CPU مفید است.

جمع‌بندی و انتخاب ابزار مناسب

ماژول time برای بسیاری از نیازهای روزمره زمان در پایتون کافی و مناسب است: گرفتن timestamp، تبدیل زمان، خواباندن و اندازه‌گیری زمان. اما برای مدیریت زمان با منطقه زمانی، یا نیاز به امکانات سطح بالا مانند آرایه‌های زمانی یا تقویم‌های پیچیده، باید از datetime یا کتابخانه‌های تخصصی استفاده کنید. در بنچمارک‌ها و اندازه‌گیری‌های دقیق، از perf_counter یا process_time متناسب با نیازتان بهره ببرید و برای timeoutها از monotonic استفاده کنید.

با پیروی از این نکات می‌توانید از رفتار صحیح، قابل‌اطمینان و قابل‌تکرار در برنامه‌های پایتون خود هنگام کار با زمان اطمینان حاصل کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: