14 روش برای افزایش سرعت پایتون

امیرحسین بیگدلو 12 ماه قبل

پایتون یک زبان برنامه نویسی قدرتمند و همه کاره است. چه در حال توسعه یک برنامه وب یا کار با یادگیری ماشینی باشید، این زبان شما را تحت پوشش قرار می دهد. به دلیل سادگی پایتون، سرعت توسعه در آن بسیار بالاست. اما اینکه بتوانید به سرعت کد بزنید، همیشه چیز خوبی نیست.

 

راه حلی که در زمان توسعه به ذهنتان میرسد همیشه بهترین نیست و ممکن است در زمان اجرا با مشکلات بهره وری مواجه شود. اگر برنامه‌ای که مینویسید کوچک است و کاربران زیادی ندارد، میتوانید به هر شکلی که دوست دارید آنرا بسازید اما اگر در یک تیم روی پروژه بزرگی کار میکنید، در پایین لیستی از ترفندهایی که به آنها نیاز پیدا میکنید، آورده شده است:

 

ویدیو مرتبط: ویدیو آموزش list comprehension در پایتون

 

 1  از list comprehension استفاده کنید

حلقه‌ها در پایتون بسیار پرکاربرد هستند. برای ساخت لیست‌های جدید میتوانید از آنها استفاده کنید. اما روش بهتری نیز وجود دارد. با list comprehension میتوانید کد خود را ساده‌تر و سریعتر کنید.

 

فرض کنید میخواهیم تمام اعداد بین 1 تا 1000 را که بر 3 بخش پذیر هستند را در یک لیست ذخیره کنیم. اگر از حلقه for استفاده کنید، به این شکل میشود:

L = []
for i in range (1, 1000):
    if i%3 == 0:
        L.append (i)

 

اما اگر از list comprehension استفاده کنید، کارتان ساده تر میشود:

L = [i for i in range (1, 1000) if i%3 == 0]

 

list comprehension از متد append سریعتر کار میکند.

 

 

 2  از متدهای داخلی پایتون استفاده کنید

پایتون متدهای داخلی بسیاری دارد. تقریبا برای هر کاری یک متد وجود دارد. ماژول‌هایی مانند itertools و functools نیز متدهای بیشتر و پیچیده‌تری را در اختیار شما قرار میدهند. متدهای داخلی پایتون به طور کامل از نظر سرعت و عملکرد بهینه شده‌اند و استفاده از آنها بسیار پیشنهاد میشود. اگر برای کاری که میخواهید انجام بدهید یک متد داخلی وجود دارد، حتما از آن استفاده کنید. بعید است بتوانید متدی بنویسید که از نظر سرعت متدهای داخلی پایتون را شکست دهد.

 

 

 3  از انتساب چندتایی متغیرها استفاده کنید

اگر قرار است چند متغیر را همزمان مقداردهی کنید، به این شکل کار نکنید:

a = 2
b = 3
c = 5
d = 7

پایتون از انتساب چندتایی پشتیبانی میکند که میتوانید چند متغیر را در یک خط مقدار دهی کنید:

a, b, c, d = 2, 3, 5, 7

 

ویدیو مرتبط: ویدیو آموزش namespace در پایتون

 

 4  از متغیرهای global استفاده نکنید

با استفاده از کلمه کلیدی global میتوانید متغیرهایی بسازید که محدوده آنها سراسری بوده و در همه جای کد در دسترس هستند. متغیرهای global زمان بیشتری برای انجام عملیات نسبت به متغیرهای local نیاز دارند. تا زمانی که مجبور نشده‌اید از متغیرهای global استفاده نکنید.

 

ویدیو مرتبط: ویدیو آموزش فانکشن‌های split و join در پایتون

 

 5  از join برای چسباندن stringها استفاده کنید

در پایتون میتوانید از  برای چسباندن دو string به یکدیگر استفاده کنید:

concatenatedString = "Programming " + "is " + "fun."

 

اما به جای آن یک متد به نام join وجود دارد که اینکار را برای شما انجام میدهد:

concatenatedString = " ".join (["Programming", "is", "fun."])

 

سرعت متد join از عملگر  بیشتر است. پس فقط از این متد استفاده کنید.

 

ویدیو مرتبط: ویدیو آموزش generator در پایتون

 

 6  از generator استفاده کنید

اگر اطلاعاتی که با آن کار میکنید حجم زیادی دارد، از generator استفاده کنید. generator به شما اجازه میدهد اطلاعات را تکه تکه خوانده و در مصرف حافظه صرفه جویی کنید.

 

 

 7  از عملگر نقطه استفاده نکنید

در زمان کار با ماژول‌های خارجی تا حد امکان از عملگر نقطه استفاده نکنید. مثال زیر را ببینید:

import math
val = math.sqrt(60)

 

زمانی که از عملگر نقطه برای دسترسی به متدهای داخلی ماژول استفاده میکنید، متدهای getattr یا getattribute فراخوانی میشود که باعث انجام عملیات‌های دیکشنری میشود. اینکار باعث اتلاف در زمان میشود. به جای آن به شکل زیر کار کنید:

from math import sqrt
val = sqrt(60)

 

ویدیو مرتبط: ویدیو آموزش متدهای __getattr__, __setattr__, __delattr__ در پایتون

 

 8  راه حل بهتری وجود دارد

اینکه چقدر بتوانید راه حل مناسبی ارائه دهید به میزان تجربه شما بستگی دارد. هر چقدر بیشتر کد بخوانید، راه حل های بهتری به ذهنتان میرسد. مثلا به کد زیر دقت کنید:

L = []
for element in set(L):
    ...

 

کد بالا به نظر خوب است چون با تبدیل list به set باعث میشود موارد تکراری حذف شوند. اما فراموش نکنید که تبدیل list به set زمان زیادی را میگیرد. به جای آن به شکل زیر کار کنید:

for element in L:
    ...

 

 

 9  برای حلقه بینهایت از عدد 1 استفاده کنید

اگر میخواهید با حلقه while یک حلقه بینهایت ایجاد کنید به جای True از عدد 1 استفاده کنید. عدد 1 از True سریعتر است:

while True: # bad
    ...


while 1: # good
    ...

 

 

 10  روش دیگری را امتحان کنید

همانطور که در بالا گفته شد، هر چه کد بیشتری بخوانید، بهتر کد مینویسید. مثال زیر را ببینید:

if a_condition:
    if another_condition:
        do_something
else:
    raise exception

 

هر چه بیشتر با ویژگی‌های یک زبان برنامه نویسی آشنا باشید، کدهای بهتری مینویسید. کد بالا را میتوانیم با عملگر not و or بازنویسی کنیم:

if (not a_condition) or (not another_condition):
    raise exception
do_something

 

مقاله پیشنهادی: پایتون سریعتر با PyPy

 

 11  مفسر پایتون را تغییر دهید

مفسر اصلی پایتون که CPython نامیده میشود، نسبتا کند است. اما نگران نباشد پایتون به شکل‌های دیگر نیز توسعه داده میشود. مثلا میتوانید از PyPy استفاده کنید. PyPy خیلی شبیه به CPython بوده و میتوانید برای افزایش سرعت اجرا، برنامه‌هایتان را با آن اجرا کنید.

 

 

 12  از آخرین نسخه پایتون استفاده کنید

پایتون به طور مرتب به روزرسانی شده و ارتقا می یابد و هر نسخه جدید سریعتر و بهینه تر است. بنابراین همیشه از آخرین نسخه پایتون استفاده کنید. فقط مطمئن شوید که کتابخانه هایی که می خواهید استفاده کنید با جدیدترین نسخه سازگار هستند.

 

 

 13  از in استفاده کنید

برای بررسی اینکه آیا یک آیتم در یک دنباله وجود دارد یا نه، میتوانید از کلمه کلید in استفاده کنید:

for name in member_list:
  print('{} is a member'.format(name))

 

 

 14  سریع خارج شوید

سعی کنید به محض اینکه متوجه شدید یک تابع نمی تواند کار معناداری بیشتری انجام دهد آن را ترک کنید. انجام این کار باعث کاهش تورفتگی برنامه شما و خوانایی آن می شود. همچنین به شما این امکان را می دهد که از دستورات if تو در تو اجتناب کنید.

if positive_case:
  if particular_example: 
    do_something
else:
  raise exception

 

قبل از انجام اقدامات خود می توانید ورودی را به چند روش آزمایش کنید. روش دیگر این است که exception را زودتر مطرح کنید و عمل اصلی را در قسمت دیگر حلقه انجام دهید.

if not positive_case:
  raise exception
if not particular_example:
  raise exception
do_something 

 

اکنون می توانید ببینید که این بلوک کد در نگاه اول به چه کاری میکند. شما نیازی به دنبال کردن زنجیره منطق در شرایط شرطی ندارید. همچنین، به وضوح می توانید ببینید که این تابع چه زمانی استثنا ایجاد می کند.

 

 

 #  جمع بندی

امیدواریم برخی از این نکات به اجرای سریع‌تر کد شما کمک کند و به شما امکان دهد عملکرد بهتری در پایتون از برنامه خود داشته باشید.

مطالب مشابه



مونگارد