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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: sajadspeed در 05 دی 1401، 08:42 ق‌ظ

عنوان: رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: sajadspeed در 05 دی 1401، 08:42 ق‌ظ
سلام دوستان سوالی که میپرسم صرفاً توی پایتون است ولی اگه به شکل گلوبال‌تر هم کسی راهنمایی کنه ممنون می‌شم.
تیتر اول یعنی Reduce Activity in Loops توی لینک زیر ببینید:
https://www.w3schools.com/js/js_performance.asp (https://www.w3schools.com/js/js_performance.asp)

خوب همین موضوع ما توی پایتون هم باید رعایت کنیم؟ واقعاً مفسر پایتون نمی‌تونه یه تمپی چیزی بگیره از این؟(خیلی دوست داشتم درس طراحی کامپایلر بخونم ولی متأسفانه از توی سر فصل دانشگاه برش داشتن  :D ;D)
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: دانیال بهزادی در 05 دی 1401، 11:35 ق‌ظ
تا جایی که می‌دونم، مفسّر پایتون خودش این موضوع‌ها رو مدیریت می‌کنه.
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: Dragon- در 06 دی 1401، 12:30 ق‌ظ
این لینکه چیزی نمیاره.
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: sajadspeed در 06 دی 1401، 12:59 ق‌ظ
بله یه بریک‌لاین اشتباهی خورده بود وسطش، الان اصلاح شد.
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: sajadspeed در 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!

با ۳ ثانیه تاخیر، البته درسته این یک تابع هست و داره اجرا میشه و در موضوع قبل یه جورایی یه پروپرتی فقط خونده میشه، ولی با این قاعده پس مفسر پایتون این مورد توی حلقه‌ها هندل نمیکنه. نظرتون چیه؟
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: دانیال بهزادی در 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
که خب همون‌طور که گفتم در پایتون درست نیست.
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: sajadspeed در 10 دی 1401، 12:22 ب‌ظ
نه ببینید گفتم که توی اون کدی که من نوشتم توی سناریو خیلی بزرگ‌نمایی شده، موضوع سر اثبات یه قضیه بود که مطرح کردم اونم اینه که وقتی مفسر پایتون به حلقه برخورد میکنه توی هر بار تکرار حلقه اون مقادیر داخل شرط دوباره حساب میکنه یا نه، منظورم نتیجه شرط نیست، اونو که هر سری باید حساب کنه، منظورم عملوندهای درون عبارت شرطیه، که ظاهرا همین کار انجام میده.

حالا موضوع اینه آیا اگه یه مقدار تمپ از هر کدوم نگه‌داره بهتر نیست؟ مثلا توی شرط زیر:
getCount() < getLimit()از خود دو عملوند بالا یه مقدار موقت گرفته بشه. البته با فرض این که مقادیر اون دو تا تابع توی طول مدت تکرار حلقه تغییر نکنه...
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: دانیال بهزادی در 10 دی 1401، 01:03 ب‌ظ
البته با فرض این که مقادیر اون دو تا تابع توی طول مدت تکرار حلقه تغییر نکنه...
خودت پاسخ خودت رو دادی
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: sajadspeed در 10 دی 1401، 07:45 ب‌ظ
آره همون خودمم رسیدم به این جملم فهمیدم  ;D ولی گفتم شاید نکته‌ای چیزی اضافه بر این باشه ارسال کردم دیگه...
بازم ممنون از وقتی که گذاشتید جناب بهزادی.
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: EnriqueTTE در 25 دی 1401، 11:55 ب‌ظ
یه کد ساده برای جواب دادن به سوال یه نفر نوشتی، دلیل این چیه جناب بهزادی؟؟
#!/usr/bin/python3
# Released under GPLv3+ License
# Danial Behzadi <dani.behzi@ubuntu.com>, 2022.

ما هم هر کدی میزنیم باید براش لایسنس بنویسیم؟
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: sajadspeed در 26 دی 1401، 12:24 ق‌ظ
شاید قالب پیش‌فرضی است که تنظیم کرده، احتمالا توی ویم...
عنوان: پاسخ : رفتار مفسر پایتون در حلقه‌ها
ارسال شده توسط: دانیال بهزادی در 26 دی 1401، 05:48 ب‌ظ
بله. کدی که پروانهٔ انتشار نداشته باشه، مالکیتی و غیراخلاقیه.