انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: رفتار مفسر پایتون در حلقه‌ها  (دفعات بازدید: 994 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 978
  • جنسیت : پسر
رفتار مفسر پایتون در حلقه‌ها
« : 05 دی 1401، 08:42 ق‌ظ »
سلام دوستان سوالی که میپرسم صرفاً توی پایتون است ولی اگه به شکل گلوبال‌تر هم کسی راهنمایی کنه ممنون می‌شم.
تیتر اول یعنی Reduce Activity in Loops توی لینک زیر ببینید:
https://www.w3schools.com/js/js_performance.asp

خوب همین موضوع ما توی پایتون هم باید رعایت کنیم؟ واقعاً مفسر پایتون نمی‌تونه یه تمپی چیزی بگیره از این؟(خیلی دوست داشتم درس طراحی کامپایلر بخونم ولی متأسفانه از توی سر فصل دانشگاه برش داشتن  :D ;D)
« آخرین ویرایش: 06 دی 1401، 12:59 ق‌ظ توسط sajadspeed »

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #1 : 05 دی 1401، 11:35 ق‌ظ »
تا جایی که می‌دونم، مفسّر پایتون خودش این موضوع‌ها رو مدیریت می‌کنه.
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #2 : 06 دی 1401، 12:30 ق‌ظ »
این لینکه چیزی نمیاره.
میدونید که زکات علم نشر آن است

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 978
  • جنسیت : پسر
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #3 : 06 دی 1401، 12:59 ق‌ظ »
بله یه بریک‌لاین اشتباهی خورده بود وسطش، الان اصلاح شد.

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 978
  • جنسیت : پسر
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #4 : 09 دی 1401، 07:17 ب‌ظ »
تا جایی که می‌دونم، مفسّر پایتون خودش این موضوع‌ها رو مدیریت می‌کنه.
نه ظاهرا مدیریت نمی‌کنه. مثلا برنامه زیر اجرا میکنیم:
import time

def getCount():
print("getCount()")
time.sleep(0.5)
return 5

i = 0
while(i < getCount()):
print(i)
i += 1

print("Finish!")

خروجی میشه این:
getCount()
0
getCount()
1
getCount()
2
getCount()
3
getCount()
4
getCount()
Finish!

با ۳ ثانیه تاخیر، البته درسته این یک تابع هست و داره اجرا میشه و در موضوع قبل یه جورایی یه پروپرتی فقط خونده میشه، ولی با این قاعده پس مفسر پایتون این مورد توی حلقه‌ها هندل نمیکنه. نظرتون چیه؟

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #5 : 10 دی 1401، 12:00 ب‌ظ »
کدی که نوشتی، ارتباطی با اون چیزی که تو w3s نوشته بود نداره. من یه کدی شبیه بهش نوشتم به این صورت:
#!/usr/bin/python3
# Released under GPLv3+ License
# Danial Behzadi <dani.behzi@ubuntu.com>, 2022.

import time


def bad():
    arr = list(range(9999999))
    start = time.time()
    for i in range(len(arr)):
        pass
    stop = time.time()
    return stop - start


def good():
    start = time.time()
    for i in range(9999999):
        pass
    stop = time.time()
    return stop - start


print(f"bad: {bad()}")
print(f"good: {good()}")
خروجیش شد این:
bad: 0.16060471534729004
good: 0.160383939743042
که فرق معنی‌داری با هم ندارن.


اگه بخوای ببینی کجا فرق دارن با هم، باید یه مقدار از ساختار درست‌نویسی تو پایتون خارج بشی و کمی غیراستاندارد بنویسی. مثل این:
#!/usr/bin/python3
# Released under GPLv3+ License
# Danial Behzadi <dani.behzi@ubuntu.com>, 2022.

import time


def bad():
    arr = list(range(9999999))
    i = 0
    start = time.time()
    while i < len(arr):
        i += 1
    stop = time.time()
    return stop - start


def good():
    i = 0
    start = time.time()
    while i < 9999999:
        i += 1
    stop = time.time()
    return stop - start


print(f"bad: {bad()}")
print(f"good: {good()}")
که خروجیش می‌شه این:
bad: 0.7553167343139648
good: 0.38115859031677246
که خب همون‌طور که گفتم در پایتون درست نیست.
« آخرین ویرایش: 10 دی 1401، 12:05 ب‌ظ توسط دانیال بهزادی »
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 978
  • جنسیت : پسر
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #6 : 10 دی 1401، 12:22 ب‌ظ »
نه ببینید گفتم که توی اون کدی که من نوشتم توی سناریو خیلی بزرگ‌نمایی شده، موضوع سر اثبات یه قضیه بود که مطرح کردم اونم اینه که وقتی مفسر پایتون به حلقه برخورد میکنه توی هر بار تکرار حلقه اون مقادیر داخل شرط دوباره حساب میکنه یا نه، منظورم نتیجه شرط نیست، اونو که هر سری باید حساب کنه، منظورم عملوندهای درون عبارت شرطیه، که ظاهرا همین کار انجام میده.

حالا موضوع اینه آیا اگه یه مقدار تمپ از هر کدوم نگه‌داره بهتر نیست؟ مثلا توی شرط زیر:
getCount() < getLimit()از خود دو عملوند بالا یه مقدار موقت گرفته بشه. البته با فرض این که مقادیر اون دو تا تابع توی طول مدت تکرار حلقه تغییر نکنه...

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #7 : 10 دی 1401، 01:03 ب‌ظ »
البته با فرض این که مقادیر اون دو تا تابع توی طول مدت تکرار حلقه تغییر نکنه...
خودت پاسخ خودت رو دادی
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 978
  • جنسیت : پسر
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #8 : 10 دی 1401، 07:45 ب‌ظ »
آره همون خودمم رسیدم به این جملم فهمیدم  ;D ولی گفتم شاید نکته‌ای چیزی اضافه بر این باشه ارسال کردم دیگه...
بازم ممنون از وقتی که گذاشتید جناب بهزادی.

آفلاین EnriqueTTE

  • High Sr. Member
  • *
  • ارسال: 607
  • جنسیت : پسر
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #9 : 25 دی 1401، 11:55 ب‌ظ »
یه کد ساده برای جواب دادن به سوال یه نفر نوشتی، دلیل این چیه جناب بهزادی؟؟
#!/usr/bin/python3
# Released under GPLv3+ License
# Danial Behzadi <dani.behzi@ubuntu.com>, 2022.

ما هم هر کدی میزنیم باید براش لایسنس بنویسیم؟
I am Enriquette

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 978
  • جنسیت : پسر
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #10 : 26 دی 1401، 12:24 ق‌ظ »
شاید قالب پیش‌فرضی است که تنظیم کرده، احتمالا توی ویم...

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : رفتار مفسر پایتون در حلقه‌ها
« پاسخ #11 : 26 دی 1401، 05:48 ب‌ظ »
بله. کدی که پروانهٔ انتشار نداشته باشه، مالکیتی و غیراخلاقیه.
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن