عنصر زمان در توسعه برنامههای مختلف، استفادههای گوناگونی دارد. ممکن است بخواهیم زمان ارسال درخواست را بررسی کنیم. یا در هنگام اجرای برنامه، وقفه ایجاد کنیم. در این آموزش به کار با زمان در پایتون میپردازیم. از کتابخانه time در پایتون استفاده کرده و با توابع مختلف آن آشنا شویم.
زمان در سیستمهای کامپیوتری
همانطور که ممکن است بدانید، زمان در سیستمهای کامپیوتری با ثانیه سنجیده میشود. همه زمانها یک مبدأ زمانی دارند. مبدا زمان کامپیوترها یکم Jan سال 1970 میلادی ساعت 00:00 بامداد است.
زمان در کامپیوتر به صورت ثانیههای گذشته شده از ساعت مبدأ محاسبه میشود. سپس با تبدیل محاسباتی خاص، میتوان آن را تبدیل به ساعتها و تاریخ کرد.
ماژولها و کتابخانههای متعددی برای کار با زمان در پایتون وجود دارند. اکثراً برای کاربرد خاصی در برنامه نویسی استفاده میشوند.
یکی از اصلیترین این ماژولها که به صورت پیشفرض همراه با پایتون در اختیار قرار میگیرد کتابخانه time است.
این کتابخانه توابعی مختلفی برای دریافت زمان فعلی سیستم، محاسبه زمانها و ایجاد وقفه در اختیار ما قرار میدهد.
در ادامه مقاله به بررسی کار با ماژول time در پایتون خواهیم پرداخت.
کتابخانه time برای کار با زمان در پایتون
برای استفاده از این ماژول ابتدا باید آن را وارد برنامه کنیم.
import time
حال میتوانیم با صدا زدن توابع مختلف روی time کارهای مربوط به زمان را انجام دهیم.
دریافت زمان سیستم
اولین و یکی از پر کاربردترین توابعی که در این ماژول وجود دارد، تابع time()
است. این تابع، زمان فعلی سیستم را به ما خروجی میدهد. خروجی به صورت float بوده و همان ثانیههای سپری شده از مبدأ زمان میباشد.
time.time()
# 1568285153.2479844
زمان فعلی همراه با تاریخ امروز
تابع دیگری در ماژول time پایتون تحت عنوان localtime()
وجود دارد. این تابع یک شئ از نوع time.struct_time
باز میگرداند. این شئ در اصل یک tuple (یا چند تایی) حاوی اطلاعاتی از زمان حال است.
time.localtime()
# time.struct_time(tm_year=2019, tm_mon=9, tm_mday=12, tm_hour=15,
# tm_min=18, tm_sec=28, tm_wday=3, tm_yday=255, tm_isdst=1)
عناصر این لیست به ترتیب و با توجه به اسم آنها عبارتاند از:
- tm_year : سال به میلادی
- tm_mon : ماه جاری
- tm_mday : شماره روز ماه (مشخص کننده چندم ماه)
- tm_hour : ساعت فعلی
- tm_min : دقیقه زمان حال
- tm_sec : ثانیه زمان
- tm_wday : شمارش روز هفته (چندمین روز هفته جاری با احتساب دوشنبه معادل 0)
- tm_yday : شمارش روز سال (امروز چندمین روز سال است ؟)
- tm_isdst : مشخص کننده فعال بودن ساعت تابستانی (daylight)
میتوانیم این شئ را در متغیری ذخیره کرده و از ویژگیهای آن استفاده کنیم. برای مثال در قطعه کد زیر، سال و شمارنده روز سال را چاپ کردهایم.
now = time.localtime()
print( now.tm_year) # 2019
print( now.tm_yday) # 255
تبدیل ثانیه به ساعت و تاریخ روز
دیدیم که به کمک تابع time()
میتوانیم زمان را به صورت ثانیه گرفته و نگه داریم. حال ممکن است یک مقدار عددی (ثانیه) داشته باشیم که بخواهیم آن را تبدیل به زمان کنیم. (بیشتر بدانید: تعریف تابع در پایتون)
برای تبدیل ثانیه به روز و ساعت و دقیقه در پایتون از تابع ctime()
در کتابخانه زمان پایتون استفاده خواهیم کرد.
time.ctime(1568286074.8505077)
# 'Thu Sep 12 15:31:14 2019'
اگر هیچ مقداری به عنوان ورودی تابع به آن ندهیم، به صورت پیشفرض زمان حال را خروجی میدهد.
تبدیل زمان و تاریخ خاص به ثانیه
فرض کنید یک تاریخ و زمان خاصی را داشته باشیم و بخواهیم معادل ثانیه آن را محاسبه کنیم. برای این کار از تابع mktime()
کمک خواهیم گرفت.
این تابع یک tuple پایتون به عنوان ورودی میگیرد که ساختارش میبایست مشابه ساختار خروجی تابع localtime()
باشد.
t = ( tm_year=2020, tm_mon=7, tm_mday=21,
tm_hour=3, tm_min=50, tm_sec=29, tm_wday=1,
tm_yday=203, tm_isdst=1 )
time.mktime( t ) #1595287229.0
در اصل این تابع برعکس تابع localtime()
عمل میکند.
چاپ زمان با فرمت خاص زمان در پایتون
در اکثر اوقات، در هنگام کار با زمان در پایتون نیاز داریم یک زمان را با فرمت خاصی نمایش دهیم. برای این کار میتوان از تابع strftime()
استفاده کرد.
این تابع دو ورودی دارد.
- ورودی اول به صورت رشتهای مشخص کننده فرمت دلخواه ماست.
- ورودی دوم یک تاپل (tuple) مشخص کننده زمان مورد نظر ما میباشد.
current_time = time.localtime()
time_string = time.strftime( "%m/%d/%Y %H:%M:%S", current_time )
print(time_string) # 09/12/2019 16:01:21
نمادهایی که در رشته مشخص کننده فرمت خروجی استفاده میشوند، نمادهایی هستند که برای مشخص کردن زمان استفاده میشوند. اگر میخواهید به خروجی تابع print() ساختار دهید، آموزش format در پایتون را ببینید.
اگر میخواهید با تمام نمادهای کار با زمان در پایتون آشنا شوید، به جدول نمادهای زمان پایتون در مستندات مراجعه نمایید.
تبدیل زمان با فرمت به ثانیه
اگر بخواهیم عکس عمل قبلی را انجام دهیم، از تابع strptime()
استفاده خواهیم کرد. این تابع دو ورودی از ما میگیرد.
- ورودی اول به صورت رشته و مشخص کننده فرمت زمان ورودی است.
- ورودی دوم به صورت رشته و زمان مورد نظر ما است.
time_string = "13 Sep 2019"
result = time.strptime( time_string, "%d %b %Y" )
print(result)
# time.struct_time( tm_year=2019, tm_mon=9, tm_mday=13,
# tm_hour=0, tm_min=0, tm_sec=0,
# tm_wday=4, tm_yday=256, tm_isdst=-1 )
اگر ساعت در مقدار وارد شده مشخص نباشد، صفر در نظر گرفته میشوند.
ایجاد وقفه در اجرای برنامه با تابع sleep زمان در پایتون
گاهی اوقات در توسعه برنامهها نیاز داریم برنامه را برای مدتی مشخص متوقف کنیم. برای مثال یک کار حتماً میبایست 45 ثانیه بعد از اتمام فعالیتی دیگر، انجام شود.
یا در برنامه نویسی خزندههای وب (Web Crawler) برای جلوگیری از مسدود شدن فعالیت ربات، بهتر است وقفههایی به صورت تصادفی به خزنده داده شود.
برای وقفه دادن به برنامهی در حال اجرا، از تابع sleep()
در ماژول time استفاده میشود.
ورودی این تابع یک عدد است که مقدار ثانیه وقفه در اجرا را مشخص میکند.
time.sleep( 45 )
تعریف delay تصادفی در پایتون
برای اینکه مقدار تأخیر (وقفه) اجرای برنامه به صورت تصادفی تعریف شود، میتوان به آسانی از یک مقدار Random استفاده کرد.
قطعه کد زیر در هر بار اجرای حلقه پایتون، به صورت تصادفی از 1 تا 2 دقیقه استراحت میکند.
import time
import random
while True:
# do something here
time.sleep( random.randint( 60, 120 ) )
راهکار ذخیره زمان در برنامه نویسی
تا این جای کار انواع توابعی که برای کار با زمان در پایتون استفاده بیشتری دارند را بررسی کردیم. اما ممکن است برای ذخیرهسازی زمان مقداری سر در گم شده باشید!
روشهای زیادی برای ذخیرهسازی زمان وجود دارد. دو راهکار ساده و متداول آن را به مختصر بررسی میکنیم.
1- ذخیره ثانیه زمان مورد نظر
در این حالت تمام مقادیر زمانی ما به صورت یک عدد که مشخص کننده ثانیه سپری شده از مبدأ است را ذخیره میکنیم. هر گاه نیاز بود، میتوان آن را با روشهای گفته شده به رشته پایتون (string) قابل خواندن تبدیل کرد.
مزیت این روش مقایسه بسیار راحت زمانها با یکدیگر است! برای مقایسه کوچکتر یا بزرگتری دو زمان، کافی است آن دو عدد را با هم مقایسه کنیم!
2- ذخیره زمان قابل خواندن برای انسان
در این حالت، در اصل فرمت قابل خواندن توسط انسان را در پایگاه داده خود ذخیره میکنیم.
این راهحل بررسی جداول داده را راحتتر خواهد کرد. همچنین برای برنامههایی که نیاز به نمایش زمانهای مختلف ذخیره شده داریم، بهینهتر است؛ زیرا نیازی به محاسبهی چند باره زمان نخواهیم داشت.
محاسبه زمان اجرای برنامه در پایتون
یکی از رایجترین استفادههای برنامهنویسان از ترفندهای کار با زمان در پایتون، محاسبه زمان اجرای برنامه است.
با یک ترفند ساده و استفاده از ماژول time در پایتون خواهیم توانست مدت زمان اجرای کد را به طور کاملاً دقیق محاسبه کرد.
برای این کار، باید قبل از شروع قطعه کد مورد نظر، زمان فعلی را به کمک تابع time()
ثبت کرده و پس از اجرا نیز همین کار را انجام دهیم.
تفاضل این دو زمان، معادل با زمان اجرای برنامه خواهد بود.
برای مثال، فرض کنید میخواهیم مدت زمان اجرای برنامه زیر را به دست بیاوریم.
در این برنامهی ساده، با یک حلقه for اعداد 1 تا 500 را با هم جمع کرده و در خروجی چاپ میکنیم.
sum = 0
for n in range(1,500):
sum += n
print(sum)
برای محاسبه زمان اجرا، قبل از شروع حلقه for
با صدا زدن تابع time()
زمان فعلی را در متغیر start
میریزیم.
در انتها نیز با صدا زدن دوبارهی همین تابع، زمان شروع را از آن کم کرده و در خروجی نمایش میدهیم.
import time
start = time.time()
sum = 0
for n in range(1,500):
sum += n
print(sum)
print("Run Time: " + str( time.time() - start ))
زمان اجرای برنامه برای من حدود 0.0249 ثانیه شد!
124750
Run Time: 0.024934053421020508
به همین راحتی توانستیم زمان اجرای برنامه در پایتون را با استفاده از ترفندهای کار با زمان که یاد گرفتیم محاسبه کنیم.
جمعبندی: کار با ساعت در پایتون و ماژول time
در این آموزش کار با کتابخانه time در زبان برنامه نویسی پایتون را یاد گرفتیم. با استفاده از توابع مختلف آن، زمان فعلی سیستم را گرفته و زمانهای مختلف را به یکدیگر تبدیل کردیم.
در ابتدا با کاربرد تابع time()
آشنا شدیم که زمان فعلی سیستم را به صورت ثانیههای سپری شده خروجی میدهد. سپس این مقدار را به کمک تابع strftime()
به فرمت قابل خواندن تبدیل کردیم.
در ادامه با تابع sleep()
در اجرای برنامه خود وقفه ایجاد کردیم. در انتها نیز به بررسی روشهای ذخیره زمان در برنامه نویسی پرداختیم.
شما از چه تکنیکهایی برای کار با زمان در پایتون استفاده میکنید؟ جای کدام تابع یا روش در این آموزش خالی است؟ بخش دیدگاهها برای نظرات و سوالات شماست.