Получи случайную криптовалюту за регистрацию!

Python Заметки

Логотип телеграм канала @pythonotes — Python Заметки P
Логотип телеграм канала @pythonotes — Python Заметки
Адрес канала: @pythonotes
Категории: Технологии
Язык: Русский
Количество подписчиков: 2.71K
Описание канала:

Интересные заметки и обучающие материалы по Python
Контакт: @paulwinex
Хештеги для поиска:
#tricks
#libs
#pep
#basic
#regex
#qt
#django
#2to3
#source
#offtop

Рейтинги и Отзывы

3.00

3 отзыва

Оценить канал pythonotes и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

2

3 звезд

0

2 звезд

0

1 звезд

1


Последние сообщения 6

2021-06-28 12:02:21 В прошлом примере мы добились совпадения хеш-суммы двух архивов. Но не даёт покоя тот факт, что делается это слишком долго. Давайте сравним скорость.

>>> from timeit import timeit
>>> timeit("hashlib.md5(
open('archive1.tar.gz', 'rb').read()
).hexdigest()", number=100, globals=globals())
# 8.6
>>> timeit("get_hash_tar1('archive1.tar.gz')",
number=100, globals=globals())
# 29.8

Разница больше чем в 3 раза! Видимо потому, что кроме простого чтения байтиков мы еще применяем алгоритм разжатия данных?

Кажется что для 100 итераций это время нормальное, но представьте что архив будет размером не 50 Мб а 10Гб. Время возрастёт серьезно!

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

def get_hash_tar2(path):
hsum = hashlib.md5()
with tarfile.open(path) as tar:
for file in tar.getmembers():
hsum.update(file.chksum.to_bytes(8, byteorder='big'))
return hsum.hexdigest()

>>> timeit.timeit("get_hash_tar2('archive1.tar.gz')",
number=100, globals=globals())
11.5

Прирост скорости x3! Уже неплохо, почти как просчет хеша для архива без разжатия.
Почему так, можно почитать в комментарии. Если коротко, мы считываем только заголовки элементов архива. Но на сколько я понял, это не отменяет чтение всего буфера из архива.

А можно быстрей? Можно...

#libs #tricks
789 views09:02
Открыть/Комментировать
2021-06-25 12:02:30 Для проверки целостности или идентичности файлов всегда используется проверка контрольной суммы.
Это работает в большинстве случаев, но не всегда. Давайте сделаем простой тест.
Создадим несколько рандомных файлов

import os

# create random test files
files_to_archive = []
for i in range(5):
name = f'example_file{i}.txt'
open(name, 'wb').write(os.urandom(10**7))
files_to_archive.append(name)

Я создал 5 файлов с рандомными бинарными данными. Нам сейчас неважно что там находится, главное что это некоторые файлы по 10мб.

Добавим их в архив два раза

import tarfile
def create_tar(archive_path, files):
with tarfile.open(archive_path, 'w:gz') as tar:
for file in files:
tar.add(file)

create_tar('archive1.tar.gz', files_to_archive)
create_tar('archive2.tar.gz', files_to_archive)

И проверим хеш сумму

>>> hashlib.md5(open("archive1.tar.gz", "rb").read()).hexdigest()
'ded8771a6ba57281f52a0e0ec38c29b8'
>>> hashlib.md5(open("archive2.tar.gz", "rb").read()).hexdigest()
'2a70bd3137a174393197cf67cbe91a8d'

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

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

def get_hash_tar(path):
hsum = hashlib.md5()
with tarfile.open(path) as tar:
for file in tar.getmembers():
hsum.update(tar.extractfile(file).read())
return hsum.hexdigest()

>>> get_hash_tar('archive1.tar.gz')
'0b27c443737b0a84381b827e1d9a913b'
>>> get_hash_tar('archive2.tar.gz')
'0b27c443737b0a84381b827e1d9a913b'

Таким образом мы обошли те байты архива которые отличаются и посчитали только фактические данные файлов.

#libs #tricks
612 views09:02
Открыть/Комментировать
2021-06-24 11:16:54
PythonBoost - новый авторский канал о языке Python в котором мы, разработчики с опытом даем вам - ученикам контент для обучения, решаем и объясняем задачи.

Как раз сейчас у нас проходит кодинг-марафон в 10 задач с призом в 5500 руб.

Читайте, решайте задачки и учитесь вместе с PythonBoost.
424 views08:16
Открыть/Комментировать
2021-06-23 12:02:43
Недавно писал тесты для модуля, который рисует на картинках текст и разные фигуры.
Обычные ошибки в коде можно поймать простым исключением. Но как убедиться что нарисовано именно то что надо? Например цвет правильный или шрифт выбран верно. Для этого нужно визуально сравнивать правильный рендер и тест.

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

Очень удобно проверять расхождения даже в мелочах. Например если что-то пошло не так и использовался шрифт по умолчанию. К тому же мелкие различия глазами не так уж просто заметить. Видите разницу в 1 процент на картинке к посту? Нет? А она есть !

https://github.com/datenhahn/imgcompare

#libs #tricks
717 views09:02
Открыть/Комментировать
2021-06-22 12:00:03 ​​ Хотим обратить ваше внимание на полезный telegram-канал для обучения высокоуровневому языку программирования Python

На канале ежедневно публикуются задачи по Python и Machine Learning: алгоритмы, функции, классы, регулярные выражения, итераторы, генераторы, ООП, исключения, numpy, pandas, matplotlib, scikit-learn, TensorFlow и многое другое!

Станьте специалистом по Python вместе с каналом "Задачи по Python и машинному обучению"
587 views09:00
Открыть/Комментировать
2021-06-21 10:02:19 28 июня стартует новый сезон Podlodka Backend Crew!

Анонсируем двухнедельный заплыв в Базы данных и чистый код Java

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

Во время первой недели, посвященной Базам данных, будем разбираться с БД фундаментально, без привязки к языкам и фреймворкам. Узнаем:
- принципы выбора БД под конкретные задачи;
- решение проблем с блокировками таблиц и медленными запросами;
- внутренние оптимизации: от индексов до алгоритмов работы с диском.

Вторая неделя поведает о чистом коде в Java. Разберёмся как:
- увеличить читаемость и поддерживаемость кода;
- избавиться от рутины и бойлерплейта в Java;
- на практике применять принципы чистого кода.

Смотри подробности на нашем сайте и успевай на борт!
420 views07:02
Открыть/Комментировать
2021-06-18 12:02:28 Модуль ensurepip, стал стандартным начиная с версии 3.4 и портирован в 2.7

Это встроенная альтернатива файлу get-pip.py. Модуль позволяет установить или обновить pip.

Установка pip:

python -m ensurepip

Обновление до актуальной версии

python -m ensurepip --upgrade

Установка в директорию юзера, если вас не устраивает системный или просто нет доступа для обновления (когда не используем venv, то есть ставим глобально)

python -m ensurepip --user

#libs #basic
613 views09:02
Открыть/Комментировать
2021-06-14 18:00:03 @tobeprog - авторский канал о том, как стать программистом. Основная задача канала - полностью разобрать путь становления разработчика, провести по нему читателя и сделать это наиболее эффективно:

Что полезного тут можно найти:
- Python, основы | что читать/смотреть | как правильно использовать уч.материалы
- Что значит программировать, почему многие не понимают этот процесс и как эту проблему решить
- О том, как превратить скучные проекты в интересные

welcome @tobeprog
633 views15:00
Открыть/Комментировать
2021-06-11 12:02:21 Тип строки в Python имеет очень много удобных методов. Сегодня пост про два таких метода которые чаще всего используются "однобоко". Это методы startswith() и endswith()

Самый обычный сценарий использования — проверка, начинается ли строка с указанной подстроки?

>>> "some_string".startswith("some")
True

И аналогичная ситуация с зеркальным вариантом этой функции, проверка совпадения с конца

>>> "some_string".endswith("some")
False

Так они используются в большинстве случаев что я видел. Но у этих функций есть еще два варианта использования.

Сравнение нескольких подстрок
Для проверки нескольких подстрок в одной строке обычно вызывают эти функции несколько раз. Но на самом деле достаточно передать кортеж со всеми строками один раз. Если будет хоть одно совпадение то функция вернёт True.

>>>"my_image.png".endswith(("jpg", "png", "exr"))
True

Диапазон поиска
Вторым аргументом можно передать индекс символа с которого следует начать сравнение, а третий аргумент это индекс последнего символа.

>>> ".filename.ext".startswith("file", 1)
True
>>> "file_###.ext".endswith('#', 0, -4)
True

Индексы можно указать отрицательными, что означает отсчёт с конца.

#trics #basic
618 viewsedited  09:02
Открыть/Комментировать
2021-06-09 12:03:17 Что-нибудь слышали про Лабораторию динамики флуоресценции?
Если не интересуетесь конкретно этой наукой то здесь вам ловить нечего. Кроме одного момента! Сотрудник лаборатории Christoph Gohlke поддерживает неофициальную библиотеку бинарников для Python под Windows. Большая коллекция скомпиленных библиотек под разные версии Python.

Именно здесь я долгое время качал старую версию PySide под Python2 и OpenImageIO, пока не потребовалось собрать её иначе.

В общем, всем тем кто на Windows, советую страничку в закладки. Также будет полезно тем кто еще на Python2.
Кстати, эта коллекция всё еще обновляется.

#libs #2to3
674 views09:03
Открыть/Комментировать