بسم الله الرحمن الرحیم
سلام.
قبل از شروع بحث اصلی لازم می دونم که که خیلی سریع دسته بندی زبان های برنامه نویسی رو از نظر نوع خوانش کد بررسی کنیم:
زبان های برنامه نویسی به 2 دسته تقسیم می شن:
زبان های کامپیلری - زبان های مفسری
زبان های کامپایلری در واقع زبان هایی هستن که یک بار کل کد ها رو ترجمه می کنن (که کامپیوتر خیلی راخت بتونه اون ها رو بخونه) و بعد از روی کد ها ترجمه شده برنامه اجرا میشه.
اما زبان هایی مفسری زبان هایی هستن که کد های اونا خط به خط ترجمه و تفسیر میشه برای کامپیوتر به همین دلیل میزان ram بالاتری نسبت به کامپایلری ها مصرف می کنن و خود این موضوع دلیلی هست بر سرعت پایین تر زبان های مفسری نسبت به زبان های کامپایلری
البته این رو هم در نظر بگیرید که از مزیت های زبان های مفسری اینه که معمولا به زبان انسان نزدیک تره تا زبان کامپیوتر , همچنین وابسته به نوع سخت افزار نیست :)
حال که زبان های برنامه نویسی رو از نظر نوع خوانش کد خیلی سریع بررسی کردیم، احتمالا متوجه شدید چرا زبان برنامه نویسی پایتون از زبان هایی مثل ++C، C و... کمتره. :(
سرعت کمتر پایتون همیشه به خاطر ساختار خود زبان نیست. بلکه برخی مواقع این ما برنامه نویس ها هستیم که با کد نویسی غیر حرفه ای مون باعث میشیم سرعت برنامه پایین بیاد و آخرش هم تقصیر رو هم میندازیم گردن اون زبان بیچاره :|
در این نوشته به تحقیق کانال یوتیوب Mr. Robot به این می پردازیم که چجور حرفه ای کد بزنیم تا سرعت برنامه هایی که با پایتون می نویسم بالاتر بره!
اگه نوع برنامه و پروژه ای که درگیرش هستیم نیازی به ویرایش نداره (چون در Tuple ها نمیشه ویرایش کرد)، بهتره به جای List از Tuple استفاده کنیم.
نوع داده Tuple سریع تر از نوع داده List است.
نوع حلقه for به خاطر ساختار dynamic و پویایی که داره باعص میشه وقت بیشتری برای اجرای اون صرف بشه بنابراین تا میتونید به جای for از حلقه while استفاده کنید.
A = [1, 2, 3, 4, 5] z = [] for number in A: z.append(number) print(z) # [1, 2, 3, 4, 5]
می توانیم به سادگی هر چه تمام تر کد بالا را با کد زیر جایگزین کنیم:
A = [1, 2, 3, 4, 5] z = [number for number in A] print(z) # [1, 2, 3, 4, 5]
a = "Hello" b = 23 c = True d = 5j e = ["Reza", "Hooman", "Ali"]
می توانیم کد بالا را با کد پایین جایگزین کنیم:
a, b, c, d, e = "Hello", 23, True, 5j, ["Reza", "Hooman"]
متغیر های global زمانی زیادی را برای شناخته شدن صرف می کنن بنابراین حتی المقدور از اون ها استفاده نکنید.
اگه دوست دارید بیشتر درباره Global Variables بدونید، اینجا کلیک کنید.
یکی از قدرت ها پایتون، کتاب خونه های اون هستن!
کتاب خونه ها برای راحت تر کد نوشتن ساخته شدن و دلیلی نداره از اون ها استفاده نکنید!
به عنوان مثال اگر می خواهید جذر یه عدد رو بگیرید، لزومی نداره خودتون تابع جذر بنویسید بلکه می تونید خیلی خیلی راحت با استفاده از math به تابع sqrt دسترسی پیدا کنید.
به عنوان مثال اگه می خواهید از sqrt استفاده کنید؛ این نوع import کردن کتاب خونه بدترین شکل ممکنه!
import math print(math.sqrt(16))
این حالت خیلی بده چون هر وقت می خواهید که از sqrt درون کتاب خونه math استفاده کنید، به طور خودکار تمام توابع درون کتاب خونه پردازش میشه و بعد برای شما sqrt رو اعمال می کنه.
اما شکل حرفه ای اون این جوریه:
from math import sqrt print(sqrt(16))
اینجوری فقط تابع sqrt درون math پردازش میشه. همین...
عملگر + یک رشته جدید می سازه و سپس دو رشته قبل و بعد از خودش رد به اون منتقل می کنه
MyInfo = {"name" : "Reza", "surname" : "Amraei"} print(MyInfo["name"] + MyInfo["surname"]) # RezaAmraei
اما متد join صرفا دو رشته رو به هم می چسبونه و رشته جدیدی خلق نمی کنه
اون رشته های که join بهش می چسبه حکم جدا کننده یا seperator رو داره
MyInfo = {"name" : "Reza", "surname" : "Amraei"} print(" ".join(MyInfo.values())) # Reza Amraei
در مثال بالا رشته خالی " " حکم جدا کننده میون اعضای دیکشنری رو داره
علاوه بر دیکشنری، می تونید از متد join در لیست و تاپل سِت هم استفاده کنید.
گاهی پیش میاد که می خواهیم اعضای تکراری یک لیست رو حذف کنیم و به این نتیجه می رسیم که لیست رو به سِت (چون در سِت ها اعضای تکراری خودکار حذف میشن) و بعد دوباره از سِت به لیست تبدیل کنیم.
خوب این کار زمان زیادی میبره :(
هر دو عبارت while 1 و همچینن while True یک معنی یکسان دارند اما برا کامپیوتر با توجه نوع پردازش اون، while 1 زمان کمتری می بره.
گاهی پیش میاد که می خواهیم اگه دو تا شرط (یا بیشتر) برقرار بود، برنامه فلان کار رو انجام بده.
نوع نوشتن کند ترش اینجوری میشه:
a = 12 b = 7 if a > 10: if b < 10: print("OK")
اما برای سریع تر کردن برنامه، باید هر دو شرط در یک خط باشن:
a = 12 b = 7 if a > 10 and b < 10: print("OK")
اصل حکمت توابع lambda در پایتون به خاطر سرعت بیشتر اون هاست. این توابع کار های دم دستی تر و راحت تر def رو انجام میدن.
همون طور که اول نوشته هم گفتیم، زبان های کامپایلری بالاخص ++C و C از سرعت بسیار بالایی برخوردار هستن.
کتاب خونه هایی که به این زبان ها نوشته میشن هم به نسبت از سرعت بالاتری برخوردار هستن نسبت به کتاب خونه هایی که به زبان پایتون نوشته شدن.
از این دست کتاب خونه ها میشه به این موارد اشاره کرد: Numpy - Scipy - Pandas
پای پای و همچنین سای پای هر دو جایگزین هایی هستند برای نسخه اصلی پایتون.
سای پای از زبان C برای سریع تر کردن برنامه های پایتون کمک میگیره که انصافا هم خیلی سریع تره.
اما PyPy حدود 4 الی 5 برابر سای پای هم سریع تره.!
پایتون در نسخه 2 از 1 خیلی بهتر شد و همچنین در نسخه 3 از 2 خیلی بهتر شد.
هر وقت که نسخه 4 اومد تعصبی رو نسخه 3 نداشته باشید و سریعا به نسخه جدیدتر کوچ کنید.
از طرفی خرده نسخه ها رو هم فراموش نکنید قطعا نسخه 3.10 از نسخه 3.2 خیلی بهتره!
منبع: کانال یوتیوب Mr Robot