گونه ای نادر و کم یاب از برنامه نویسها
چطور در پایتون کد بهتری بزنیم؟
سلام. توی این مطلب میخوام بهتون بگم که چطوری توی پایتون یه کد کارآمد تر توی پایتون بنویسید. با من همراه باشید.
برای افزودن موارد به لیست ها از پیوندها استفاده کنید
به جای اضافه کردن line1 و line2 به mymsg به صورت جداگانه ، از لیست و jion استفاده کنید.
این کار را نکنید:
mymsg=’line1\n’
mymsg+=’line2\n’
راه بهتر:
mymsg=[‘line1’,’line2']
‘\n’.join(mymsg)
از استفاده از عملگر + برای رشته ها خودداری کنید
اگر می توانید از عملگر + برای الحاق استفاده نکنید. از آنجا که رشته ها تغییرناپذیر هستند ، هر بار که عنصری را به یک رشته اضافه می کنید ، پایتون یک رشته و آدرس جدید ایجاد می کند. این بدان معنی است که هر بار که رشته تغییر می کند ، باید حافظه جدید اختصاص یابد.
این کار را نکنید:
msg="Hello"+myMissage+"World"
راه بهتر:
msg="Hello %s World" %myMessage
و یا
msg=f"Hello {myMessage} World"
استفاده از Generator ها
ژنراتور ها به شما امکان می دهند تابعی را ایجاد کنید که در آن واحد یک مورد را برگرداند نه همه موارد را
به صورت همزمان. این به این معنی است که اگر یک مجموعه داده بزرگ دارید ، لازم نیست منتظر بمانید تا کل مجموعه داده قابل دسترسی باشد.
def __iter__(self):
return self._generator()
def _generator(self):
for item in self.item:
yield item
ارزیابی ها را خارج از حلقه قرار دهید
اگر از طریق داده iterating می شوید ، می توانید از نسخه ذخیره شده regex استفاده کنید.
match_regex=re.compile("foo|Bar")
for i in big_it:
m=match_rejex.search(i)
تابع را به یک متغیر local اختصاص دهید
پایتون بسیار کارآمدتر از متغیرهای global به متغیرهای local دسترسی پیدا می کند. توابع را به متغیرهای local اختصاص دهید سپس از آنها استفاده کنید.
myLocalFunc=myObj.func
for i in range(n):
myLocalFunc(i)
از توابع و کتابخانه های داخلی استفاده کنید
هر زمان که می توانید از توابع و کتابخانه های داخلی استفاده کنید. توابع داخلی اغلب با استفاده از بهترین روشهای استفاده از حافظه اجرا می شوند.
این کار را نکنید:
mylist=[]
for myword in oldlist:
mylist.append(myword.upper())
راه بهتر:
mylist=map(str.lower, oldlist)
راه بهتر برای ایجاد یک مجموعه داده با آرگومان های کلمه کلیدی (key word arguments) از حلقه ها:
mycounter = Counter (a = 1, b = 2, c = 3, d = 5, e = 6, f = 7, g = 8)
for i in mycounter.elements():
doSomeThing
خلاص شدن از شر حلقه های ناخواسته با استفاده از ابزارهای itertools
این ابزار (itertools) باعث صرفه جویی در وقت شما در حلقه ها می شود. همچنین از پیچیدگی کد خلاص می شود.
این کار را انجام ندهید:
mylist=[]
for shape in [True, False]:
for weight in (1, 5):
firstlist=firstlist+function(shape, weight)
راه بهتر:
from itertools import product, chain
list(chain.from_iterable(function(shape, weight) for weight, shape in product([True, False], range(1, 5))))
رونویسی (Overwriting) و بهره برداری از کلاس های بزرگ برای مدیریت ایمنی و حافظه
رونویسی از __new__ و بهره گیری از کلاسهای فرعی نیز برای مدیریت حافظه در هنگام اجرای الگوهای Singleton و Flyweight مفید و ایمن است. به عنوان مثال ، در اینجا مثالی از یک شی dict است که یک فایل Yaml را می خواند. از آنجا که این متا کلاس یک الگوی طراحی یکپارچه است پس از تعریف ، می توان آن را در هر نقطه از سیستم وارد کرد و دوباره تعریف کرد و مفسر فقط به شی initial اولیه اشاره می کند. اثر حافظه را کاهش می دهد و ایمنی را تضمین می کند. هر چقدر یک توسعه دهنده دیگر در تیم جوان باشد ، آنها باعث ایجاد اشیا تکراری نخواهند شد ، و از این کار جلوگیری می کنند تا دستورالعمل را در یک قسمت از سیستم تغییر دهند و در قسمت دیگر دستور دیگری را ارجاع دهند.
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class ConfigDict(dict, metaclass=Singleton):
def __init__(self):
super().__init__(self.read_config_file())
@staticmethod
def read_config_file():
“””
Reads config file based on path passed when running app.
:return: (dict) loaded data from yml file
“””
config_file_path = sys.argv[-1]
if not config_file_path.endswith(“.yml”):
raise ConfigDictError(message=”yml file not passed into flask app but {}
instead”.format(config_file_path))
return yaml.load(open(str(config_file_path)), Loader=yaml.FullLoader)
مطلبی دیگر از این انتشارات
VMware vMotion چیست؟
مطلبی دیگر از این انتشارات
الاستیک سرچ توی Sequelize
مطلبی دیگر از این انتشارات
تفاوت Consul, ZooKeeper, Eureka