انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: 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)
-
تا جایی که میدونم، مفسّر پایتون خودش این موضوعها رو مدیریت میکنه.
-
این لینکه چیزی نمیاره.
-
بله یه بریکلاین اشتباهی خورده بود وسطش، الان اصلاح شد.
-
تا جایی که میدونم، مفسّر پایتون خودش این موضوعها رو مدیریت میکنه.
نه ظاهرا مدیریت نمیکنه. مثلا برنامه زیر اجرا میکنیم:
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!
با ۳ ثانیه تاخیر، البته درسته این یک تابع هست و داره اجرا میشه و در موضوع قبل یه جورایی یه پروپرتی فقط خونده میشه، ولی با این قاعده پس مفسر پایتون این مورد توی حلقهها هندل نمیکنه. نظرتون چیه؟
-
کدی که نوشتی، ارتباطی با اون چیزی که تو 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
که خب همونطور که گفتم در پایتون درست نیست.
-
نه ببینید گفتم که توی اون کدی که من نوشتم توی سناریو خیلی بزرگنمایی شده، موضوع سر اثبات یه قضیه بود که مطرح کردم اونم اینه که وقتی مفسر پایتون به حلقه برخورد میکنه توی هر بار تکرار حلقه اون مقادیر داخل شرط دوباره حساب میکنه یا نه، منظورم نتیجه شرط نیست، اونو که هر سری باید حساب کنه، منظورم عملوندهای درون عبارت شرطیه، که ظاهرا همین کار انجام میده.
حالا موضوع اینه آیا اگه یه مقدار تمپ از هر کدوم نگهداره بهتر نیست؟ مثلا توی شرط زیر:
getCount() < getLimit()
از خود دو عملوند بالا یه مقدار موقت گرفته بشه. البته با فرض این که مقادیر اون دو تا تابع توی طول مدت تکرار حلقه تغییر نکنه...
-
البته با فرض این که مقادیر اون دو تا تابع توی طول مدت تکرار حلقه تغییر نکنه...
خودت پاسخ خودت رو دادی
-
آره همون خودمم رسیدم به این جملم فهمیدم ;D ولی گفتم شاید نکتهای چیزی اضافه بر این باشه ارسال کردم دیگه...
بازم ممنون از وقتی که گذاشتید جناب بهزادی.
-
یه کد ساده برای جواب دادن به سوال یه نفر نوشتی، دلیل این چیه جناب بهزادی؟؟
#!/usr/bin/python3
# Released under GPLv3+ License
# Danial Behzadi <dani.behzi@ubuntu.com>, 2022.
ما هم هر کدی میزنیم باید براش لایسنس بنویسیم؟
-
شاید قالب پیشفرضی است که تنظیم کرده، احتمالا توی ویم...
-
بله. کدی که پروانهٔ انتشار نداشته باشه، مالکیتی و غیراخلاقیه.