Хитрые приёмы на Python

Оглавление (нажмите, чтобы открыть):

BreakingCode

Красивый Питон — часть 5. Другие идиомы Python.

Это пятый пост из серии статей об идиомах Python. В статье рассмотрим некоторые идиомы Python, которые не были описаны в прошлых постах, но достойны внимания. Внутри описаны правила именования, импорта, а так же польза контекст-менеджеров.

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

Идиомы Python, достойные упоминания

Правила именования

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

Довольно просто и понятно, комментировать особо нечего. Однако стоит отметить, что в Python нет приватных переменных, как в Java. Но добавление символа подчеркивания (_) указывает, что переменная не должна быть вызвана другими приложениями. Это что-то вроде кодекса чести.

Импорт

В Python есть много способов импорта классов и пакетов. Тем не менее, некоторые лучше и предпочтительнее других.

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

Контекст-менеджеры

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

Приведенные выше пример ярко показывает пользу менеджеров контекста. Вам не нужно вызывать метод file.close() после завершения обработки файла, все это язык сделает за вас.

Это был последний пост из серии статей, рассказывающих про идиомы Python. Надеюсь, вы узнали что-то новое из этой или других статей цикла. Стоит отметить, что 5 статей, без сомнения, не охватывают всех возможностей языка. В них описаны далеко не все полезные приемы и способы написания кода. Тем не менее, использование описанных методик при написании ваших проектов поможет им стать более лаконичными и удобными для восприятия.
Спасибо Jamal Moir за замечательные советы.

Шпаргалки по Python — хитрости которые вы не используете!

Многие люди начинают переезжать с версии 2 на 3 из-за Python EOL (Поддержка Python 2.7 прекратиться с 2020 года). К сожалению, часто Python 3 выглядит как Python 2 со скобками. В статье я покажу несколько примеров существующих функций, которыми вы можете пользоваться только в Python 3, с надеждой на то, что это поможет решать ваши текущие и будущие задачи.

Все примеры написаны в Python 3.7 и каждая функция содержит минимальную версию Python для этой функции.

F-строки (Python 3.6+)

Сложно делать что-либо без строк в Python и чтобы сохранить адекватность, вам нужно иметь структурированный способ работы со строками. Большая часть людей, работающих с Python, предпочитают метод format python.

Наряду с format , Python 3 предоставляет гибкий способ выполнения интерполяции строк через f-строки. Тот же код, что и показанный выше, с использованием f-strings выглядит так:

Pathlib (Python 3.4+)

F-строки — это отличное решение, но некоторые строки, такие как пути файлов, имеют свои собственные библиотеки, которые заметно упрощают работу. Python 3 предоставляет pathlib в качестве удобной абстракции для работы с путями файлов.

Подсказки типов | Ожидание типа | Type hinting (Python 3.5+)

Спор о том, какое типизирование python лучше — статическое или динамическое — не умолкают и по сей день и у каждого есть свое мнение на этот счет. Это личное дело читателя — когда ему нужно вписывать типы, но мне кажется что вы как минимум должны знать о том, что Python 3 поддерживает подсказки типов.

Перечисления enum (Python 3.4+)

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

Перечисление — это набор символических имен (членов), связанных уникальным, постоянным значением. С перечислением, члены можно сравнить по идентичности, а само перечисление может повторяться.

Встроенный LRU кэш (Python 3.2+)

Кэш содержится практически в любом горизонтальном отрезке программного обеспечения, которым мы пользуемся сегодня. Python 3 делает их использование очень простым, предоставляя кэш LRU (Least Recently Used) в качестве декоратора под названием lru_cache .

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

Теперь мы можем использовать lru_cache для оптимизации (эта техника оптимизации называется меморизация). Время выполнения варьирует от секунд до наносекунд.

Повторяемая расширенная распаковка (Python 3.0+)

Здесь код будет говорить сам за себя (документация):

Классы данных (Python 3.7+)

Python 3 представляет классы данных, которые не имеют большого количества ограничений и могут быть использованы для сокращения стандартного кода, так как декоратор автоматически генерирует специальные методы, такие как __init__() и __repr()__ . Из официального заявления, они описываются как “изменяемые названные кортежи со значениями по умолчанию”.

Та же реализация класса Armor при помощи классов данных.

Пространства имен (Python 3.3+)

Один из способов структуризации кода Python заключается в пакетах (папки с файлом __init__.py ). Пример ниже предоставлен официальной документацией Python.

В Python 2, каждая папка выше должна иметь файл __init__.py , который делает папку пакетом Python. В Python 3, с появлением неявных пакетов пространств имен, эти файлы больше не нужны.

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

Подведем итоги

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

Хитрые приёмы на Python

Как развернуть список, как красиво распечатать словарь, оператор деления из будущего и http сервер одной строчкой и т. п.

Экспериментальная функция:

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

Просим обратить внимание, что текст по ссылке и здесь может не совпадать.

Hi there folks. It’s been a long time since I last published a post. I have been busy. However in this post I am going to share some really informative tips and tricks which you might not have known about. So without wasting any time lets get straight to them:

Enumerate

Instead of doing:

Enumerate can also take a second argument. Here is an example:

Dict/Set comprehensions

You might know about list comprehensions but you might not be aware of dict/set comprehensions. They are simple to use and just as effective. Here is an example:

Forcing float division:

If we divide whole numbers Python gives us the result as a whole number even if the result was a float. In order to circumvent this issue we have to do something like this:

But there is another way to solve this problem which even I wasn’t aware of. You can do:

Voila! Now you don’t need to append . in order to get an accurate answer. Do note that this trick is for Python 2 only. In Python 3 there is no need to do the import as it handles this case by default.

Simple Server

Do you want to quickly and easily share files from a directory? You can simply do:

This would start up a server.

Evaluating Python expressions

We all know about eval but do we all know about literal_eval? Perhaps not. You can do:

I am sure that it’s something new for most of us but it has been a part of Python for a long time.

Profiling a script

You can easily profile a script by running it like this:

Object introspection

You can inspect objects in Python by using dir(). Here is a simple example:

Debugging scripts

You can easily set breakpoints in your script using the pdb module. Here is an example:

You can write pdb.set_trace() anywhere in your script and it will set a breakpoint there. Super convenient. You should also read more about pdb as it has a couple of other hidden gems as well.

Simplify if constructs

If you have to check for several values you can easily do:

Reversing a list/string

You can quickly reverse a list by using:

and the same can be applied to a string as well:

Pretty print

You can print dicts and lists in a beautiful way by doing:

This is more effective on dicts. Moreover, if you want to pretty print json quickly from a file then you can simply do:

Ternary Operators

Ternary operators are shortcut for an if-else statement, and are also known as a conditional operators. Here are some examples which you can use to make your code compact and more beautiful.

Thats all for today! I hope you enjoyed this article and picked up a trick or two along the way. See you in the next article. Make sure that you follow us onFacebook and Twitter!

Небольшие хитрости в Python.

Фишки из книги python cookbook.

Задача: Получить список N максимальных или минимальных элементов коллекции.

Задача: Получить максимальное и минимальное значение из списка

Самое важная возможность кучи состоит в том, что heap[0] всегда будет наименьшим элементом.

Самый простой способ.

Задача 3: Создать словарь, который отображает ключи на более чем одно значение (так называемый «мультисловарь», multidict).

Делается это так

Задача: Создать упорядоченный словарь

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

  • Задача: Проводить различные вычисления (например, поиск минимального и максимального значения, сортировку) на словаре с данными.

Чтобы выполнить вычисления на содержимом словаря, часто бывает полезно обратить ключи и значения, используя функцию zip().

Когда вы производите эти вычисления, обратите внимание, что zip() создает итератор, по которому можно пройти только один раз.

Задача: Найти общие элементы в двух словарях

Чтобы найти общие элементы, просто выполните обычный набор операций с использованием методов keys() и items().

Задача: исключить дублирующиеся значения из последовательности, но при этом сохранить порядок следования оставшихся элементов.

Если вы просто хотите удалить дубликаты, то часто достаточно будет создать множество.

Однако этот поход не сохраняет какой бы то ни было порядок, поэтому результат будет перемешан.

Если у вас есть экземпляр slice, сохранённый в переменной s, вы можете получить больше информации о нём, если посмотрите на атрибуты s.start, s.stop и s.step. Например:

На входе объектам класса Counter можно скормить любую последовательность хэшируемых элементов. В основе Counter лежит словарь, который отображает элементы на количество вхождений.

  • Создать список, при этом есть два условия

Возвратит список корней числа, если есть корни, если нет, вернет квадрат

  • Заменить if/else и вернуть True или False
  • Преобразовать список целых чисел в одно число
  • Имеется переменная d, в зависиммости от d применить несколько условий.

Делаю файтинг на Python

sasha20l

Well-known member

Делаю текстовый файтинг на Python для обучения.
Буду помаленьку выкладывать код.
Если увидите ошибки или те места где я косячу, прошу подсказать =)
У меня опыта мало, а Вы можете подсказать что да как.
Спасибо))

Мастер Йода рекомендует:  Смоделируйте использование игральной кости с семью гранями, если в вашем распоряжении имеется

Tayler

Active member

sasha20l

Well-known member

explorer

sasha20l

Well-known member

Всем привет. Ввиду ремонта 2 недели не занимался игрой.

Собственно игра пришла к альфа версии, она запускается, работает но еще надо процентов 50 дописать.
Это текстовый файтинг между двумя игроками (в дальнейшем сделаю компьютерных врагов)

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

explorer

Пока она действительно ещё кривая. Выбрал Предмет/умение — вижу что их ещё нет, но программа сама выбрала атаковать.

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

Могу написать статью если что, как писать чистый код на Python.

sasha20l

Well-known member

Пока она действительно ещё кривая. Выбрал Предмет/умение — вижу что их ещё нет, но программа сама выбрала атаковать.

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

Могу написать статью если что, как писать чистый код на Python.

Да с удовольствием поучусь писать чище.
К сожалению по другому пока совсем не умею)
Пока пытаюсь только хотя-бы заставить игру работать =)
Это уже хоть что-то.
По поводу предметов и защиты, эти меню еще не готовы совсем.
Они просто зациклены на атаку.
Пока что подготовил механику а уже на нее будут накручены возможности.
А планы грандиозные .
выбор оружия, умений, предметов, лут, прохождение врагов с сопутствующими наградами.

Подскажите что за программу Вы используете для определение чистоты кода ?

Питонячьи хитрости

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

Многоточие

Неожиданно, при определенных условиях многоточие . становится правильной лексемой! Внутри оператора [] многоточие вырождается в объект Ellipsis :

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

В другом месте многоточие вызовет ошибку синтаксиса.

Срезы в аргументах

В оператор индекса [] можно передать синтаксис словаря: key: value, . . Тогда в методе __getitem__ мы получим кортеж объектов slice . Ключ и значение хранятся в полях .start и .stop . Выглядит так:

Деструктивный синтаксис

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

Это объективный минус третьего Питона. Зачем лишать разработчиков удобной возможности? Я постоянно работаю с парами. Синтаксиса def action((key, val)): теперь будет не хватать.

Погружение в словарь

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

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

Неочевидный минус, из-за которого придется чинить прод в пятницу, кроется в методе .get . Он возвращает дефолт только если ключа нет. А если ключ есть и равен None , то вернется None вне зависимости от того, что передано в дефолт.

В библиотеке f я предложил нормальный способ работы со вложенными словарями:

Конечное приведение типов

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

Этот прием спасает злополучного None , который лезет изо всех щелей. Беда в том, что в скриптовых языках нет четких правил для пустых значений. Например, функция может отдать или пустой список, или None . Запомнить невозможно. Рано или поздно None провалится туда, где ожидают список или число.

Решение – выводить типы самостоятельно. Поскольку оператор or ленив во всех языках, выражение справа не будет вычислено без необходимости. Следующий код:

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

Правые методы

Еще одна особенность классов в Питоне – правые волшебные методы. Они начинаются с префикса r : __radd__ , __rsub__ и т.д. Как следует из названия, эти методы вызываются для правого операнда в тех случаях, когда для левого операнда метод не определен.

Другими словами, рассмотрим выражение a + b . Сперва Питон попытается сделать так: a.__add__(b) . Если для a метод __add__ неопределен, будет предпринята другая попытка: b.__radd__(a) . И если __radd__ тоже не определен для b , вылезет ошибка.

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

Особенности среза в тройке

Во втором Питоне у классов был особый метод __getslice__ для получения среза. В тройке его объединили с __getitem__ . Теперь интерпретатор проверяет, что передано в __getitem__ . Если написать foo[1:2] , будет передан экземпляр класса slice , а если foo[1, 2] – кортеж.

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

Программирование Python по моим конспектам Лекция 5

Пост можно топить, минусить и всячески убивать, ибо в горячем он нахер не нужен, а вот подписчикам пригодится.

Здоров, дорогие друзья и подруга.

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

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

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

Если говорить языком простым и не витиеватым. Скрипт- это и есть сама программа. А вообще это обычный текстовый файл. Ага. Такие дела. Только этот текстовый файл имеет свое расширение, и соответственно православно верное содержание, которое может «скушать» и не подавиться наш интерпретатор. Скрипты в питон имеют расширение .py или в Виндовсе встречаются также .pyw . Запускать скрипты питона можно как и обычные екзешники на винде. И еще один приятный бонус- скрипты питона системонезависемы. Сие значит, что они запустятся на машине с Unix и Виндовс одинаково. Единственная разница, что интерпретаторы в каждой из систем свои.

Надеюсь, что истина пошла в массы и вопросов не возникло. А если возникли..ну вы знаете, что я напишу, а потом зачеркну.

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

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

Итак.Тихо все. Успокоились. И нежно открываем наш IDLE. При этом дышим ровно. Это важно. Затем так же нежно идем в File и выбираем New. Или же для ленивых нажимаем Ctrl+N. Круто так окошко пустое появилось? Не появилось? Смени раскладку тогда на клавиатуре.

Итак-то что мы видим- это наше все. Это то, где будут рождаться ваши самые смелые идеи и хелоуворды. Сие есть ничто иное как обычный блокнот, но с продвинутыми функциями.

Итак начинаем ваять.

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

Надеюсь, вы справились. А теперь наша задача такова.

1. Вывести на экран надпись «настоящее время:»

2. Вывести непосредственно время

Так вот. Я добрался до той самой крутой функции, о которой говрил. Зовут ее print(). Она выводит на экран значения указных в ней выражений, а затем ставит знак перевода каретки на новую строку.

Ради экономия времени и места Я настоятельно рекомендую ознакомиться с этой функцией, ровно как и любой другой функцией, о которой я говорю в других источниках. Однако я приведу пару примеров того, что эта функция умеет

Итак, мы близки к цели. Пишем следующую строку

Тем самым мы выводим на экран надпись «настоящее время и дата» и переводим каретку на новую строку, где в перспективе должно появиться время и дата.

А теперь задаемся вопросом. А как бы нам время вывести то? Так вот, докладываю. В модуле time, есть замечательный метод asctime(), который возвращает 24-символьную строку следующего вида: ‘Вт 17 февраля 2009 23:21:05’. Этот метод мы передаем как аргумент функции print.

В итоге, получаем такую картинку.

Так вот, если у вас есть желание или необходимость- список всех доступных в питоне модулей и функций легко найти в интернете. Ничего сверхъестественного в этом нет.

Ну вот. Теперь мы близки к цели. И делаем следующее

1 Делаем умную морду

2 Прячем непотребные журналы с дивицами под шкаф

4 жмем F5, сохраняя файл в любое удобное место.

6 Купаемся в лучах славы.

А теперь еще один финт ушами. Ищем файл, который вы сохранили минуту назад на ПК и кликаем на него два раза.

Ой..чейта было то!! Не сцыте мои друзья и подруга, все хорошо. Просто Программа выполнила все, что мы от нее хотели и окно закрылось. Ага.. я же говорил, что ПК- тупая машина, и ей надо все объяснять как дебилу. Она делает только то, что мы ей сказали, а потом закрывается, если не дано других команд. Сейчас мы немного обманем нашу программу и скажем ей

«пока я ентер не нажму, ты падлина, не смей пропадать»

Так вот, в конце кода пишем волшебную функцию

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

Такие дала. Выглядит солиднее. И ощущается чувство хацкерства.

На этом мои полномочия..все.

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

п.п.с Если умные головы находят у меня ошибку- я всегда рад исправиться и покаяться

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

Общественная записная книжка

следы для себя и потомков

четверг, 5 июля 2020 г.

Python

  • Working with Python Pandas and XlsxWriter
  • Обработка данных с помощью pandas
  • Creating Excel files with Python and XlsxWriter
  • PyMystem3 — морфологическая библиотека для русского языка
  • Logging — библиотека для удобного ведения логов в Python
  • zipapp — Manage executable python zip archives
  • доступ к Exchange (python)
  • Принимает и отправляем почту на python через outlook
  • Отправляем push-уведомления в Linux используя Python
  • Тестирование в Python [unittest]. Часть 2. TestCase
  • PyInstaller is a program that freezes (packages) Python programs into stand-alone executables, under Windows, Linux, Mac OS X, FreeBSD, Solaris and AIX
  • Automate the Boring Stuff with Python
  • Click — library for CLI interface for our python scripts
  • Kivy — Open source Python library for rapid development of applications
    that make use of innovative user interfaces, such as multi-touch apps.
  • How to decode a QR-code image in (preferably pure) Python?
  • PyAutoGUI is a Python module for programmatically controlling the mouse and keyboard.
  • Behave is behavior-driven development, Python style.
  • Хакинг FFmpeg с помощью Python — часть первая, часть вторая
  • PostgreSQL python
  • https://www.fullstackpython.com/postgresql.html
  • SqliteBrowser — sudo dnf install sqlitebrowser
  • Sqlite3
  • Python: Работа с базой данных, часть 1/2: Используем DB-API
  • SQLite в многопоточных приложениях
  • Работа с БД
  • http://qaru.site/questions/84392/python-sqlite3-and-concurrency
  • Модуль unittest: тестируем свои программы
  • Тестирование в Python [unittest] Часть1Часть2Часть3Часть4
  • Погружаемся в основы и нюансы тестирования Python-кода
Мастер Йода рекомендует:  Основы функционального программирования на JavaScript

  • Визуализация данных c Python
  • https://tech.yandex.ru
  • Если нужно быстро и легко расшарить файлы из директории

python3 -m http.server

Scrapy Shell is a command line tool that provides you opportunity to test your parsing code without running thee entire crawler.
Unlike the crawler which goes to all the links, Scrapy Shell save the DOM of an individual page for data extraction.
Например:
scrapy shell https://www.olx.com.pk/item/asus-eee-pc-atom-dual-core-4cpus-beautiful-laptops-fresh-stock-IDUVo6B.html#4001329891

  • sudo apt-get install libpulse-dev
  • sudo apt-get install libpcre3 libpcre3-dev
  • установить http://www.swig.org/download.html
  • pip3 install pocketsphinx

[Unit]
Description=X Virtual Frame Buffer Service
After=network.target

[Service]
ExecStart=/usr/bin/Xvfb :99 -screen 0 1024x768x24

  • Python-telegram-bot
  • https://python-telegram-bot.readthedocs.io/en/stable/
  • Пишем телеграмм бот на Python
  • Python telegram.InlineKeyboardButton() Examples
  • https://monsterdeveloper.gitbooks.io/writing-telegram-bots-on-java/lesson-7.-creating-users-database-with-mongodb.html
  • Пишем диалоговые боты
  • Как писали фриланс биржу в телеграм боте
  • Отсылка сообщений при определенных событиях
  • Telegram messenger CLI
  • Автоматизация оповещения от ТелеграммБота
  • Telethon — библиотека для работы с телеграммом

Проекты с телеграмм ботами

  • Telegram боты. Загружаем файлы больше 50мб
  • Telegram API демон — склеиваем последовательные сообщения
  • python3 −m venv название_директория
  • source env/bin/activate — активировать виртуальное окружение
  • pip install Jupyter — установка Jupyter Notebook

Использовать virtualenv! Оно создаст изолированные окружения для ваших приложений и позволит устанавливать пакеты именно в эти окружения, а не глобально.

Для установки воспользуемся pip:

$ pip3 install virtualenv

Две основные команды:

virtualenv myproject
source myproject/bin/activate

  • dnf groupinstall ‘Development Tools’
  • dnf install gcc-c++
  • dnf install rpm-build
  • dnf install python-devel
  • dnf install python3-devel
  • dnf install python-pip
  • dnf install python3-pip
  • pip3 install jupyter
  • sudo yum install -y epel-release
  • sudo yum install -y python34
  • # Install pip3
  • sudo yum install -y python34-setuptools # install easy_install-3.4
  • sudo easy_install-3.4 pip
  • yum install python34-devel.i686
  • yum install gcc gcc-c++
    yum install python34-devel

easy_install-3.4 numpy
easy_install-3.4 pandas — будет устанавливаться долго

  • ?имя_переменной — общая информация об объекте
  • ??имя_переменной — исходный код объекта
  • %run — выполнение любого файла как Python-программу (скрипт выполняется в пустом пространстве имен)
  • %cpaste — приглашение для вставки кода
  • %timeit предложение — замер времени выполнения команды несколько раз и усредняет время выполнения
  • %time предложение — время выполнения команды
  • %reset — возвращает простр-во имен в начальное состояние
  • %quickref — вывод краткую справку по IPython
  • %magic — вывести подробная док-я по магическим командам
  • %debug — вход в интерактивный отладчик в точке послед вызова
  • %hist — напечатать историю введенных команд
  • %pdb — автоматом входить в отладчик после любого исключения
  • %paste — выполнить отформатированный код из буфера обмена
  • %cpaste —
  • %page OBJECT — сформировать красиво инфу об объекте
  • %who , %who_ls , %whos — вывод переменных с разной степению детализации
  • %xdel переменная

Взаимодествие с ОС

  • !cmd — выполнить команду в оболочке
  • output = !cmd args
  • %cd каталог
  • %pwd — текущий каталог
  • %dirs
  • %pushd каталог
  • %popd
  • %env — вернуть переменные среды в виде словаря

Интересные проекты на Python

  • ShutIt — is an automation tool that models a user’s actions on a terminal
  • AutoTEST
  • quietnet — Simple chat program that communicates using inaudible sounds
  • home-assistant — Open-source home automation platform running on Python 3
  • pytube is a lightweight, Pythonic, dependency-free, library (and command-line utility) for downloading YouTube V >task management & automation tool
  • scdl — Python Soundcloud Music Downloader
  • simiki — Simiki is a simple wiki framework, written in Python
  • SpeechPy — A Library for Speech Processing and Recognition
  • face_recognition — The world’s simplest facial recognition api for Python and the command line
  • Rodeo — A data science IDE for Python
  • Gooey — Turn (almost) any Python command line program into a full GUI application with one line

Функциональное программирование на Питоне

Материал из Seo Wiki — Поисковая Оптимизация и Программирование

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

Содержание

Возможности

Определение и использование функции

Функция в Питоне может быть определена с помощью оператора def или лямбда-выражением. Следующие операторы эквивалентны:

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

При вызове функции задаются фактические аргументы. Например:

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

Функция всегда возвращает только одно значение (или None , если значение не задано в операторе return или этот оператор не встречен по достижении конца определения функции). Однако, это незначительное ограничение, так как возвращаемым значением может быть кортеж.

Определив функцию с помощью лямбда-выражения, можно тут же ее использовать:

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

Функции в Python являются объектами первого класса, то есть, они могут употребляться в программе наравне с объектами других типов данных.

Списочные выражения

Списочные выражения (list comprehension, иногда используется термин «списковые включения») — наиболее выразительное из функциональных средств Питона. Например, для вычисления списка квадратов натуральных чисел, меньших 10, можно использовать выражение:

Встроенные функции высших порядков

В Питоне есть функции, одним из аргументом которых являются другие функции: map() , filter() , reduce() , apply() .

Функция map() позволяет обрабатывать одну или несколько последовательностей с помощью заданной функции:

Аналогичного (только при одинаковой длине списков) результата можно добиться с помощью списочных выражений:

filter()

Функция filter() позволяет фильтровать значения последовательности. В результирующем списке только те значения, для которых значение функции для элемента истинно:

Тоже самое с помощью списковых выражений:

reduce()

Для организации цепочечных вычислений в списке можно использовать функцию reduce() . Например, произведение элементов списка может быть вычислено так:

Вычисления происходят в следующем порядке:

Цепочка вызовов связывается с помощью промежуточного результата ( res ). Если список пустой, просто используется третий параметр (в случае произведения нуля множителей это 1):

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

Для наиболее распространенных операций в Питоне есть встроенные функции:

В Python 3 встроенной функции reduce() нет, но её можно найти в модуле functools .

apply()

Функция для применения другой функции к позиционным и именованным аргументам, заданным списком и словарем соответственно:

В последних версиях Питона вместо функции apply() можно применить специальный синтаксис (в продолжение примера выше):

Замыкания

Функции, определяемые внутри других функций, представляют собой полноценные замыкания (англ. closures ):

Итераторы

Другие средства функционального программирования доступны из стандартной библиотеки (например, модуль itertools ) и других библиотек.

Следующий пример иллюстрирует применение перечисляющего и сортирующего итераторов (итератор не может быть напечатан оператором print , поэтому оставшиеся в нем значения были помещены в список):

Следующий пример иллюстрирует использование модуля itertools :

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

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

Модуль functools

В Python 2.5 появился модуль functools и в частности возможность частичного применения функций:

(Частичное применение функций также можно реализовать с помощью замыканий или функторов )

Ленивые вычисления

Ленивые вычисления можно организовать в Python несколькими способами, используя различные механизмы:

  • простейшие логические операции or и and не вычисляют второй операнд, если результат определяется первым операндом
  • лямбда-выражения
  • определенные пользователем классы с ленивой логикой вычислений [1] или функторы
  • Генераторы и генераторные выражения
  • (Python 2.5) if-выражение имеет «ленивую» семантику (вычисляется только тот операнд, который нужен)

Пример, который иллюстрирует работу if-выражения. С помощью оператора print можно проследить, какие функции реально вызывались:

Некоторые примеры из книги рецептов:

Функторы

Функторами называют объекты, синтаксически подобные функциям, то есть поддерживающие операцию вызова. Для определения функтора нужно перегрузить оператор () с помощью метода __call__ . В Python функторы полностью аналогичны функциям, за исключением специальных атрибутов ( func_code и некоторых других). Например, функторы можно передавать в качестве функций обратного вызова (callback) в С-код. Функторы позволяют заменить некоторые приёмы, связанные с использованием замыкания, статических переменных и т. п.

Ниже представлено замыкание и эквивалентный ему функтор:

Следует отметить, что код, использующий замыкание, будет исполнятся быстрее, чем код с функтором. Это связанно с необходимостью получения атрибута val у переменной self (т.е. функтор проделывает на одну Python операцию больше). Также функторы нельзя использовать для создания декораторов с параметрами. С другой стороны, функторам доступны все возможности ООП в Python, что делает их очень полезными для функционального программирования. Например, можно написать функтор, который будет «запоминать» исполняемые над ним операции и затем повторять их. Для этого достаточно соответствующим образом перегрузить специальные методы.

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

Определенный подобным образом функтор создает значительные накладные расходы, так как при каждом вызове проходит по вызовам всех вложенных lambda . Можно оптимизировать функтор, применив технику генерирования байткода во время исполнения. Соответствующий пример и тесты на скорость есть в Примерах Python программ. При использовании этой техники скорость исполнения не будет отличаться от «статического» кода (если не считать времени, требующегося на однократное конструирование результирующей функции). Вместо байтокода Python можно генерировать на выходе, например, код на языке программирования C, других языках программирования или XML-файлы.

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

Используйте Psyco, и Python будет работать так же быстро, как и С

Используя Psyco, компилятор обработки Python

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

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

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

Существует несколько способов ускорить программы на Python. Первое, что должно прийти в голову любому программисту, — это улучшить алгоритмы или используемые структуры данных. Микрооптимизация шагов неумелого алгоритма -удел глупцов. Например, если порядок сложности текущей технологии O(n**2), десятикратное ускорение шагов гораздо менее полезно, чем нахождение замены O(n). Это правило применимо даже при рассмотрении такого исключительного подхода, как перепрограммирование на ассемблере: правильный алгоритм на Python часто будет выполняться быстрее, чем неверный алгоритм, переложенный вручную на ассемблер.

Мастер Йода рекомендует:  ТОП-9 фреймворков для веб-разработки, Java и Big Data в 2020 году

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

Третья технология основывается на второй. Грэг Эуинг (Greg Ewing) создал язык Pyrex, который соединяет Python и С. В частности, чтобы воспользоваться Pyrex, вы пишете функции на схожем с Python языке, который добавляет к выбранным переменным объявления типов. Pyrex (средство) преобразует pyx-файлы в расширения «.с». После трансляции компилятором С, эти модули Pyrex (язык) могут быть импортированы и использованы в ваших обычных приложениях Python. Поскольку Pyrex использует практически такой же синтаксис, как и сам Python (включая директивы цикла, ветви и исключения, формы присвоения [assignment forms], структурированное расположение и так далее), программисту на Pyrex не нужно изучать С, чтобы писать расширения. Более того, Pyrex допускает более цельное — по сравнению с расширением, написанным непосредственно на С — смешение переменных уровня С с переменными уровня Python в пределах одного и того же кода.

Тема данной статьи — еще одна технология. Модуль расширения Psyco может встраиваться в самые недра интерпретатора Python и выборочно заменять части интерпретируемого байткода Python оптимизированным машинным кодом. В отличие от описанных выше методик, Psyco работает исключительно во время исполнения Python. Другими словами, исходный код Python транслируется командой python в байткод точно так же, как и раньше (за исключением пары директив import и вызовов функций, добавленных для запуска Psyco). Однако, пока интерпретатор Python выполняет приложение, Psyco иногда делает проверки, чтобы выяснить, может ли он заменить обычные операции байткода Python на некоторый обработанный машинный код. Эта обрабатываемая трансляция не только очень похожа на то, что делает компиляция по месту (just-in-time compilers) Java (по крайней мере, в широком смысле), но и зависит от архитектуры. В настоящее время, Psyco доступен только для архитектур с процессором i386. Прелесть Psyco заключается в том, что вы можете использовать тот же самый код Python, который вы писали всё это время (буквально!), но исполнять его быстрее.
Как Psyco работает

Чтобы полностью понять Psyco, вам, вероятно, потребуется хорошо разбираться и в функции eval_frame() интерпретатора Python, и в ассемблере i386. К сожалению, сам я не могу претендовать на роль эксперта, но думаю, что смогу объяснить Psyco в общих чертах, не допуская слишком серьезных ошибок.

В обычном Python функция eval_frame() — это внутренний цикл интерпретатора Python. В основном, функция eval_frame() смотрит на текущий байткод в контексте выполнения и переключает управление в функцию, подходящую для реализации этого байткода. Специфика того, что эта функция поддержки будет делать, зависит, в общем, от состояния различных объектов Python, находящихся в памяти. Поясним — суммирование объектов Python «2» и «3» приводит к результату, отличному от суммирования объектов «5» и «6», хотя обе операции обрабатываются одинаково.

Psyco заменяет функцию eval_frame() составным оценочным модулем. Существует несколько способов, позволяющих Psyco улучшить то, что делает Python. Во-первых, Psyco транслирует операции в до некоторой степени оптимизированной машинный код; само по себе это приводит только к незначительным улучшениям, поскольку то, что машинный код должен выполнить, — это то же самое, что делают обработанные функции Python. Более того, то, что является «обработанным» в трансляции Psyco, это больше, чем выбор байткода Python, Psyco также уточняет значения переменных, которые известны в контексте выполнения. Например, в коде, аналогичном приведенному ниже, переменная x распознаваема на протяжении цикла:

Оптимизированной версии этого кода не нужно умножать каждый i на «содержимое переменной/объекта x» — менее расточительно просто умножать каждый i на 5, исключая тем самым поиск/косвенную ссылку.

Помимо создания кода, предназначенного для i386, для небольших операций, Psyco кеширует этот транслированный машинный код для дальнейшего использования. Если Psyco способен установить, что отдельная операция такая же, как выполненная (и «обработанная») ранее, он может положиться на этот кэшированный код, а не транслировать этот сегмент. Это экономит еще немного времени.

Реальная экономия в Psyco, однако, является результатом распределения операций по трем различным уровням. Для Psyco существуют переменные «времени исполнения («run-time»), «времени трансляции» («compile-time») и «виртуального времени» («virtual-time»). При необходимости Psyco перемещает переменные с одного уровня на другой. Переменные времени исполнения — это просто исходный байткод и структуры объекта, которые обрабатывает обычный интерпретатор Python. Переменные времени трансляции отображаются в машинные регистры и ячейки памяти с прямым доступом, как только Psyco транслирует эти операции в машинный код.

Наиболее интересный уровень — это переменные виртуального времени. Изнутри переменная Python — это полная структура с множеством членов — даже если объект представляет всего лишь целое число. Переменные виртуального времени Psyco представляют объекты Python, которые потенциально могут быть построены, если возникнет такая необходимость, но их деталями пренебрегают, пока необходимости нет. Например, рассмотрим следующее присваивание:

Стандартный Python строит и разрушает ряд объектов, чтобы вычислить это значение. Целый целочисленный (integer) объект создается для того, чтобы содержать значение (12/11); затем значение извлекается из структуры этого временного объекта и используется для вычисления нового временного объекта (13-PyInt). Psyco пропускает эти объекты и просто вычисляет значения, зная, что «при необходимости» объект может быть создан из этого значения.

Используя Psyco

Гораздо легче использовать Psyco, чем его объяснять. В основном, все, что нужно, — это сказать Psyco какую функцию/метод «обрабатывать». Не надо менять код ни одной из ваших функций Python, ни сами классы.

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

Первая строка указывает Psyco применить свою магию ко всем глобальным функциям. Вторая строка (для Python 2.2 и выше) приказывает Psyco сделать то же самое с методами класса. Чтобы немного точнее направить поведение Psyco, вы можете воспользоваться командой:

Вторая форма оставляет func в качестве стандартной функции Python, но оптимизирует вызовы, которые задействуют newname. Практически во всех случаях, кроме тестирования и отладки, форма psyco.bind() — это то, что вы будете использовать.

Производительность Psyco

Несмотря на магию Psyco, его использование требует некоторого осмысления и тестирования. Главное, что нужно понять — это то, что Psyco полезен для обработки многократно выполняющиехся циклов, и то, что он знает, как оптимизировать операции, в которых задействованы целые и числа с плавающей запятой. Для нециклических функций и для операций над другими типами объектов Psyco обычно просто добавляет накладные расходы на свой анализ и внутреннюю компиляцию. Более того, для приложений с большим числом функций и классов, включение Psyco для приложения целиком является дополнительным бременем при трансляции машинного кода и использование памяти для этого кэширования. Гораздо лучше выборочно подключить те функции, которые смогут извлечь больше пользы из оптимизации Psyco.

Я начал с самого простого тестирования. Я просто подумал, какое из приложений, которые я недавно запускал, неплохо было бы ускорить. Первый пример, который пришел мне в голову, — это программа манипулирования текстом, которую я использую для преобразования чернового варианта моей будущей книги «Текстовая обработка в Python» (Text Processing in Python) в формат LaTeX. Это приложение использует некоторые строчные методы, некоторые регулярные выражения и некую программную логику, управляемую главным образом регулярными выражениями и совпадениями строк. В действительности это ужасный кандидат для Psyco, но поскольку я его использую, я начал с него.

При первом заходе, все, что я сделал — это добавил psyco.jit() в начало моего скрипта. Достаточно безболезненно. К сожалению, результаты были (как и ожидалось) удручающими. Если первоначально скрипт работал 8.5 секунд, то после «ускорения» с Psyco он выполнялся 12 секунд. Скверно! Я догадался, что компиляция по месту, вероятно, имеет некоторые накладные расходы на запуск, которые затягивают время исполнения. Поэтому следующее, что я сделал, была обработка гораздо более крупного входного файла (состоящего из множества копий первоначального файла). Это привело к крайне скромному успеху — время выполнения сократилось со 120 секунд до 110. Это улучшение оставалось устойчивым при нескольких запусках, но в любом случае весьма незначительным.

Второй заход с моим кандидатом на обработку текста. Вместо добавления вызова psyco.jit() без параметров, я добавил только строку psyco.bind(main), поскольку функция main() имеет несколько циклов (но минимально использует арифметические операции с целыми числами). В этом случае результаты номинально были лучше. Этот подход урезал время выполнения на несколько десятых секунды для первого примера и на несколько секунд для версии большого входного файла. Но по-прежнему ничего впечатляющего (хотя и никакого вреда).

Для более достойного тестирования Psyco, я откопал некий код нейронной сети, о котором я писал в одной из предыдущих статье (см. Ресурсы). Это приложение «code_recognizer» может быть настроено для опознания возможных распределений разных значений ASCII в различных языках программирования. Нечто подобное потенциально могло бы быть полезно при угадывании типов файла (скажем, потерянных сетевых пакетов); но этот код в действительности полностью универсален в отношении того, чему он был обучен — с таким же успехом он мог бы научиться распознавать лица или звуки, или виды приливов. В любом случае «code_recognizer» базируется на библиотеке Python bpnn, которая в качестве контрольного примера также включена (в модифицированной форме) в дистрибутив Psyco 0.4. Что важно знать о «code_recognizer» в свете этой статьи, так то, что оно вычисляет много циклов с числами с плавающей запятой, и что его выполнение занимает много времени. Вот у нас и появился хороший кандидат для Psyco.

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

Скрипт «code_recognizer» содержит строки наподобие:

Другими словами, интересный момент с точки зрения Psyco находится в классе bpnn.NN. Добавление psyco.jit() или psyco.bind(NN2) в скрипт code_recognizer.py мало что дает. Чтобы Psyco выполнял желаемую оптимизацию, вам потребуется добавить psyco.bind(NN) в code_recognizer.py, либо psyco.jit() в bpnn.py. В отличие от того, что вы могли бы предположить, компиляция по месту происходит не при создании экземпляра или вызове методов, а при описании класса. Вдобавок, при подключении производных классов их унаследованные методы не обрабатываются.

Как только были выработаны детали подходящего связывания Psyco, результирующее ускорение оказалось весьма впечатляющим. Используя те же примеры тестирования и режим обучения сети, который был представлен в упомянутой статье (500 шаблонов обучения, 1000 итераций обучения), время обучения нейронной сети было уменьшено с где-то 2000 секунд до приблизительно 600 секунд — больше, чем в три раза. Сокращение числа итераций до 10 показало пропорциональное ускорение (но никуда не годное распознавание нейронной сети) — так же как и промежуточное число итераций.

Я нахожу весьма замечательным ускорение кода, выполнявшегося полчаса, до 10 минут, с помощью двух строк кода. Это ускорение, вероятно, все еще меньше скорости исполнения аналогичного приложения на С, и определенно меньше десятикратного ускорения, которое зарегистрировано в некоторых единичных случаях тестирования Psyco. Но это приложение явно из «реальной жизни», и эти улучшения достаточны для того, чтобы их отметить во многих контекстах.

Куда движется Psyco?

В настоящий момент Psyco не производит статистику или профилирование и выполняет только минимальную оптимизацию генерируемого машинного кода. Возможно, более поздняя версия будет знать, как определять операции, которые могли бы более всего выиграть от оптимизации, и выбрасывать из кеша машинный код для неоптимизируемых операций. Вдобавок, возможно, будущий Psyco мог бы решать выполнять более обширную (но и более дорогую) оптимизацию многократно исполняемых операций. Такой анализ исполнения был бы похож на то, что технология HotSpot компании Sun делает для Java. То обстоятельство, что Java, в отличие от Python, имеет декларации типов, в действительности менее значимо, чем думают многие (однако предшествующие работы по оптимизации Self, Smalltalk, Lisp и Scheme также отмечают это).

Хотя я и сомневаюсь, что это когда-нибудь случится, но было бы здорово, если бы технология типа Psyco была интегрирована в какую-нибудь будущую версию самого Python. Несколько строк для импорта и связываний — не так уж много работы, но тогда Python выполнялся бы существенно быстрее, и изначально это было бы гораздо более цельно. Поживём — увидим.

Добавить комментарий