Архив рубрики: Публикации

4 совета по оптимизации производительности для более быстрого кода на Python

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

 

1. Подготовьте все настройки заранее.

Это здравый смысл. Подготовьте все настройки. Запустите ваш редактор Python заранее. Если вы пишете свои файлы локально, создайте виртуальную среду и активируйте ее. Наряду с этим, мы бы посоветовали еще одну вещь, которая может показаться немного противоречивой и нелогичной, а именно использовать TDD. Используйте этот инструмент тестирования. Мы обычно использую pytest и используем «pip» -d в виртуальной среде и начинаем писать небольшие тестовые сценарии. Мы обнаружили, что тестирование помогает в ясности мысли, которая помогает в написании более быстрых программ. Кроме того, это помогает в рефакторинге кода, чтобы сделать его быстрее. Мы вернемся к этому позже.

 

2. Получите код, работающий первым

У людей есть свои собственные стили кодирования. Используйте стиль кодирования, который вам наиболее удобен. Для первой итерации сделайте код работоспособным. Посмотрим, пройдет ли он все тестовые случаи. И вы можете перейти к следующему вопросу.

Если он проходит для некоторых тестовых случаев, а для других — из-за проблем с памятью, то вы знаете, что еще есть работа.

 

3. Советы по программированию на Python

Мы можем использовать некоторые конструкции кода pythonic, которые дают нам лучшую производительность. Давайте посмотрим на них ниже.

 

Строки:

Не используйте нижеприведенную конструкцию.

s = ""

for x in somelist:

s += some_function(x)

 

Вместо этого используйте это

slist = [some_function(el) for el in somelist]

s = "".join(slist)

 

Это связано с тем, что в Python str является неизменным, поэтому левая и правая строки должны быть скопированы в новую строку для каждой пары конкатенации.

 

Языковые конструкции:

Функции: Создайте функции из своего кода, и хотя процедурный код поддерживается в Python, лучше писать их в функциях. Возможно, вы слышали этот совет от сторонников повторного использования кода и сторонников TDD (примечание: я один из них), но здесь мы бы сказали, что функции лучше, потому что они быстрее. Так

def main():

for i in xrange(10**8):

pass



main()

 

Это лучше, чем

for i in xrange(10**8):

pass

 

Это из-за базовой реализации CPython. Короче говоря, хранить локальные переменные быстрее, чем глобальные.

Мы бы порекомендовали вам сохранить ваш процедурный код как можно меньше. Вы можете использовать следующий стандартный шаблон.

def solution(args):

# write the code

pass



def main():

# write the input logic to take the input from STDIN

Input_args = ""

solution(input_args)



If __name__ == "__main__":

main()

 

Используйте стандартную библиотеку:

Используйте как можно больше встроенных функций и стандартной библиотеки. Поэтому вместо этого:

newlist = []

for item in oldlist:

newlist.append(myfunc(item))

 

Использовать это:

newlist = map(myfunc, oldlist)

 

Существует также список выражений или генератор выражений.

newlist = [myfunc(item) for item in oldlist] # list expression

newlist = (myfunc(item) for item in oldlist) # generator expression

 

Точно так же используйте стандартную библиотеку, такую ​​как itertools, так как они обычно быстрее и оптимизированы для обычных операций. Таким образом, вы можете иметь что-то вроде перестановки для цикла всего за три строки кода.

>> import itertools

>>> iter = itertools.permutations([1,2,3])

>>> list(iter)

[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

 

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

 

Генераторы:

Генератор Python — это функция, которая возвращает итератор генератора (просто объект, который мы можем перебрать), вызывая yield. Когда функция генератора вызывает yield, «состояние» функции генератора останавливается; Значения всех переменных сохраняются, и следующая строка кода, которая должна быть выполнена, записывается до следующего вызова (). Генераторы — это отличные конструкции, позволяющие снизить как среднюю сложность времени, так и объем памяти кода, который вы написали. Просто посмотрите на следующий код для простых чисел.

def fib():

a, b = 0, 1

while 1:

yield a

a, b = b, a + b

 

Таким образом, это будет продолжать генерировать числа Фибоначчи бесконечно без необходимости хранить все числа в списке или любой другой конструкции. Пожалуйста, имейте в виду, что вы должны использовать эту конструкцию только тогда, когда у вас нет абсолютной необходимости сохранять все сгенерированные значения, потому что тогда вы потеряете преимущество наличия конструкции генератора.

 

4. Алгоритмы и структуры данных

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

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

Написание быстрого кода — это привычка и навык, который нужно оттачивать годами. Там нет ярлыков. Так что делайте все возможное и удачи.



2019-11-21T19:07:50
Python

Строковая функция includes() в JavaScript с примерами

JavaScript предоставляет функцию includes() для поиска заданной строки по определенной подстроке. Существуют и другие методы для поиска в строковом массиве определенной строки.

Синтаксис функции includes()

Функция includes() обеспечивается строковой переменной или строковым литералом, чтобы найти заданный поисковый термин в заданной строке.

STRING.icludes(SEARCH_TERM,START);

  • STRING является строковой переменной или строковым литералом, в котором будет выполняться поиск SEARCH_TERM.
  • includes() — это функция, которую мы будем использовать со следующими параметрами. Эта функция будет возвращать логические результаты true и false в зависимости от ситуации и соответствия. Если он не соответствует, он вернет false, если есть совпадение, он вернет true.
  • SEARCH_TERM это термин, который мы будем искать в строке, который может быть строковой переменной или строковым литералом.
  • STARTэто начальный индекс поиска, из которого с указанного индекса START поиск начнется в строке STRING. START является необязательным, если он не указан, поиск начнется с начала STRING.

 

Поиск заданного термина во всей строке

Мы начнем с простого примера, где мы будем искать простой термин в данной строке. В этом примере мы создадим строковую переменную greeting и ищем «andreyex.ru» внутри переменной приветствия с помощью функции include().

var greeting="Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.";



var match = greeting.includes("andreyex.ru");



console.log(match);

/Печатает true



var match = "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("andreyex.ru");



console.log(match);

/Печатает true



var greeting="Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.";



var match = greeting.includes("ANDREYEX.RU");



console.log(match);

//Печатает false

Поиск заданного термина во всей строке

include () — это функция без учета регистра, где «andreyex.ru» и «ANDREYEX.RU» не совпадают. Таким образом, они не будут совпадать в поиске.

 

Поиск заданного термина в указанной части строки

Функция includes() также принимает индекс начала поиска, где поиск будет выполняться после этого индекса. В следующем примере мы будем искать термин «andreyex.ru» после 10-го символа.

var greeting="Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.";



var match = greeting.includes("andreyex.ru",10);



console.log(match);

// Вывести на консоль true



var match = greeting.includes("andreyex.ru",30);



console.log(match);

// Вывести на консоль false

 

Поиск заданного термина в указанной части строки

Из примеров видно, что когда индекс указан как 10, данная строка будет соответствовать, а функция includes() вернет true. Если мы укажем индекс c 30, он не будет совпадать и вернет false.

Сравнение функции includes()

Так как функция includes() возвращает логические значения, такие как true и false, мы можем сравнить эти результаты с числами, такими как 1 и -1, которые связаны с логической логикой в JavaScript. -1 представляет false и 1 представляет true.

"Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("andreyex.ru");

//Evaluated as true

1 == "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("andreyex.ru");

//Evaluated as true

1 == "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("ANDREYEX.RU");

//Evaluated as false

-11 == "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("ANDREYEX.RU");

//Evaluated as false

-1 == "Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.".includes("ANDREYEX.RU");

//Evaluated as false

 

include(). Альтернативная функция indexOf()

Функция indexOf() является альтернативой функции includes(), в которой возвращается начальный номер данного термина. Если нет совпадения, будет возвращено -1 .

var greeting="Здравствуйте, вы на сайте andreyex.ru. Вы можете найти очень хорошие статьи на этом сайте.";



index=greeting.indexOf("andreyex.ru");



console.log(index);

//Вывод 17



index=greeting.indexOf("ANDREYEX.RU");



console.log(index);

//Вывод -1

 



2019-11-21T13:25:47
Программирование

Как исправить потерю пакетов

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

Что такое потеря пакетов?

Хотя проточная вода часто используется в качестве аналогии для сетевого трафика, информация не передается по сети в виде непрерывного потока. Скорее, он отправляется в виде серии отдельных блоков, называемых пакетами . Эти блоки похожи на отдельные страницы в книге. Вместе они имеют некоторый смысл, но только когда они связаны с другими страницами в правильном порядке, они создают единое целое. Когда ваше сетевое соединение теряет пакеты, полная книга не может быть построена. Пакеты также могут доставляться неполными, поврежденными или иными дефектами, что делает их бесполезными. Решением этой проблемы обычно является повторная отправка потерянного пакета.

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

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

Что вызывает потерю пакетов в вашей сети

Потеря пакета происходит не только по одной причине. Диагностика причины потери пакетов в вашей сети покажет вам, что вам нужно исправить.

Mint Images / Getty Images

  • Пропускная способность сети и перегрузка. Основной причиной потери пакетов является недостаточная пропускная способность сети для требуемого соединения. Это происходит, когда слишком много устройств пытаются установить связь в одной сети.
  • Недостаточно мощное оборудование. Любое оборудование в сети, которое маршрутизирует пакеты, может привести к потере пакетов. Маршрутизаторы, коммутаторы, брандмауэры и другие аппаратные устройства являются наиболее уязвимыми. Если они не могут «идти в ногу» с трафиком, который вы передаете через них, они будут отбрасывать пакеты. Думайте об этом как официанте с полными руками: если вы попросите их взять другую тарелку, они, вероятно, уронят одну или несколько других тарелок.
  • Поврежденные кабели. Потеря пакетов может произойти на уровне 1, физическом сетевом уровне. Если ваши кабели Ethernet повреждены, неправильно подключены или слишком медленны для обработки сетевого трафика, они будут «пропускать» пакеты.
  • Программные ошибки: ни одно программное обеспечение не является безупречным. Микропрограмма вашего сетевого оборудования или программного обеспечения вашего компьютера может содержать ошибки, которые могут привести к потере пакетов. В этом случае потребитель мало что может сделать. Вы можете попытаться решить проблему самостоятельно, но часто единственным способом решения проблемы является исправление микропрограммы от поставщика, поставляющего оборудование. Обязательно сообщайте о предполагаемых ошибках, чтобы найти поставщиков, которые помогут решить проблему.

Обнаружение потери пакета

Существует ряд программных приложений, которые могут обнаружить потерю пакетов в сети. Они каким-то образом «вынюхивают» пакеты, анализируя время их поездки или просматривая пакеты. Самый простой способ выяснить, существует ли потеря пакетов, — это пропинговать устройства в вашей сети.

Майк Пауэлл / Getty Images

  • В Windows откройте окно командной строки и используйте команду ping для настройки вашего маршрутизатора. Например, если локальный IP-адрес вашего маршрутизатора 192.168.0.1, следующая команда будет проверять связь с маршрутизатором:
    ping 192.168.0.1 -t

    В macOS или Linux откройте окно терминала и используйте следующую команду:

    ping 192.168.0.1

    Единственное отличие — это отсутствие -t в конце команды.

  • После того, как команда ping обработает достаточное количество пакетов (не менее 10), нажмите Ctrl + C, чтобы остановить команду.
  • Посмотрите, была ли потеря пакетов. Если это конкретное соединение между устройством проверки связи и целью работает правильно, вы должны увидеть 0% потери пакетов.
    --- 192.168.0.1 ping statistics ---

    27 packets transmitted, 27 packets received, 0.0% packet loss

    round-trip min/avg/max/stddev = 1.820/8.351/72.343/14.186 ms

  • Вот и все.

    Есть также более продвинутые инструменты, доступные для обнаружения потери пакетов.
  • Команда tcpdump в macOS и Linux значительно более мощная, чем ping. Немного трудновато привыкнуть, но следующая команда перехватит пакеты, а затем подсчитает количество потерянных пакетов:
    tcpdump -i any

  • Это запустит tcpdump через любое сетевое соединение. Он также может быть запущен с -i eth0 для захвата только основного сетевого интерфейса или с -c 10 для захвата только десяти пакетов.
  • После выполнения команды посмотрите на нижнюю строку, чтобы увидеть, были ли потеряны какие-либо пакеты.
    17 packets captured

    85 packets received by filter

    0 packets dropped by kernel

  • В идеале вы должны увидеть, что 0 пакетов были потеряны.

В Windows вы можете использовать tcpdump через оболочку Bash в Windows 10 или запустить Wireshark.

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

Определение причины потери пакета

Чтобы определить основную причину потери пакетов, вы должны начать с самой простой проблемы, чтобы обнаружить и вернуться обратно.

Сначала проверьте соединение Ethernet между устройствами. Проверьте наличие явных признаков физического повреждения и неправильного подключения. Эти кабели работают правильно? Решает ли переключение кабелей проблему? Проверьте маршрутизаторы и коммутаторы аналогичным образом.

Во-вторых, определите, достаточно ли пропускной способности для обработки необходимых устройств в вашей сети. Является ли какой-либо один аппаратный элемент обработкой значительно большего количества соединений, чем следует? Это часто процесс поиска и замены, пока проблема не решится. Вы также можете использовать «заведомо исправный» коммутатор и маршрутизатор, поменяв его местами с потенциально проблемными устройствами в сети, чтобы увидеть, исчезает ли потеря пакетов при удалении определенного устройства.

Как исправить потерю пакетов в вашей сети

Как только вы определили причину потери пакета, есть два исправления, которые могут быть применены.

Первый включает в себя замену проблемного оборудования. Если ваше расследование привело к неправильной работе устройства, замените его.

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

Совет: вы можете сбросить настройки роутера.

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