Ускорение работы на Python

Написание скриптов на Python для решения самых разных задач  —  одно из моих любимых занятий. Когда самостоятельно доходишь до ответа, который предлагает Python в той или иной ситуации, всегда получаешь от этого удовольствие. И даже когда не знаешь решения, но быстренько заходишь на сайт Stack Overflow и обнаруживаешь, что кто-то в Интернете уже решил эту задачу, тебя тоже охватывает нежданная радость.

В этой статье я поделюсь 9 скриптами Python для решения практических задач и преодоления трудностей, с которыми вы наверняка столкнетесь при работе с Python.

1. Создание словарей с defaultdict и лямбда-функциями

from collections import defaultdict
import numpy as np

q = defaultdict(lambda: np.zeros(5))

# Пример вывода
In [34]: q[0]
Out[34]: array([0., 0., 0., 0., 0.])

Самое крутое в defaultdicts  —  это то, что они никогда не вызовут ошибку KeyError. Любой несуществующий ключ получает значение, возвращаемое функцией default factory (в данном случае это лямбда-функция), которая возвращает массив NumPy по умолчанию с 5 нулями для любого предоставляемого вами ключа.

2. Основной рецепт регулярных выражений

import re
pattern = re.compile(r”\d\d”)
print(re.search(pattern,"Let's find the number 23").group())
# или
print(re.findall(pattern, “Let's find the number 23”))[0]

# Выходные данные
'23'
'23'

Регулярные выражения обязательны для многих конвейеров Python, поэтому неплохо бы всегда помнить основной рецепт регулярных выражений.

3. Получение разницы между двумя списками с помощью множеств

list1 = [1,2,3,4,5]

list2 = [3,4,5]

print(list(set(list1) — set(list2)))
# или
print(set(lista1).difference(set(lista2)))

# Выходные данные
[1,2]

{1,2}

Здесь множества дают два простых способа получения разницы между двумя списками Python: в виде списка и в виде множества.

4. Частично определенные функции

from functools import partial

def multiply(x,y):
    return x*y

dbl = partial(multiply,2)

print(dbl)

print(dbl(4))

# Выходные данные

functools.partial(<function multiply at 0x7f16be9941f0>, 2)

8

Здесь создается функция, которая копирует другую, но принимает меньшее количество аргументов, чем исходная функция, для применения этого аргумента к нескольким разным аргументам.

5. Использование встроенного метода hasattr() для получения атрибута объекта

class SomeClass:
    def __init__(self):
    self.attr1 = 10
    def attrfunction(self):
        print("Attreibute")

hasattr(SomeClass, "attrfunction")

# Вывод 
True

6. Проверка переменной на соответствие заданному типу с помощью isinstance()

isinstance(1, int)
#Вывод
True

7. Вывод чисел списка с помощью map()

list1 = [1,2,3]
list(map(print, list1))

# Вывод
1
2
3

Так вывести содержимое списка быстрее и эффективнее, чем с циклами for.

8. Форматирование данных формата datetime с помощью метода .join()

from datetime import datetime

date = datetime.now()

print("-".join([str(date.year), str(date.month), str(date.day)])

# Вывод
'2021-6-7'

9. Случайная выборка элементов двух списков с одним и тем же правилом

import numpy as np

x = np.arange(100)
y = np.arange(100,200,1)
idx = np.random.choice(np.arange(len(x)), 5, replace=False)
x_sample = x[idx]
y_sample = y[idx]

print(x_sample)
print(y_sample)

# Выходные данные
array([68, 87, 41, 16,  0])
array([168, 187, 141, 116, 100])

Заключение

Улучшение работы со скриптами предполагает наличие в арсенале разработчика хорошо зарекомендовавших себя фрагментов кода, позволяющих избегать необходимости каждый день изобретать колесо.

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Lucas Soares: 9 Essential Python Snippets to Optimize your Scripting Routine

Предыдущая статьяGoogle OAuth для реализации на Ruby
Следующая статьяLeetCode  -  удаление дублей из отсортированного массива