Сколько итераций в секунду у python
Перейти к содержимому

Сколько итераций в секунду у python

  • автор:

Что может Python сделать за секунду?

Все говорят, что Python медленный, но так ли это? Пройдите наш тест и узнаете, сколько всего этот язык способен сделать за секунду!

Обложка поста Что может Python сделать за секунду?

Порой можно услышать, что Python медленный в сравнении с определёнными языками. Мы не собираемся разводить дискуссии на тему сравнения языков, а хотим посмотреть на это с другой стороны. Когда-нибудь задумывались, сколько различных операций вы можете совершить в Python всего за 1 секунду? Пройдите наш тест и узнаете!

Примечание У всех разное железо, поэтому очевидно, что приведённые здесь результаты могут отличаться от ваших, если вы решите их проверить. Поэтому ваша задача — ошибиться менее, чем в 10 раз.

Тестируемый код написан на CPython версии 2.X. Замеры проводились на современном ноутбуке с быстрым SSD и интернет-подключением.

Пишем прогресс-бары при помощи tqdm

В переводе с арабского tqdm (taqadum) означает прогресс; библиотека с таким названием используется как раз для создания индикаторов прогресса. Просто оберните любой итерируемый объект в функцию – tqdm(iterable) – и готово.

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

pip install tqdm

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

from tqdm import tqdm for i in tqdm(range(10000)): pass
100%|��������������������| 10000/10000 [00:00

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

tqdm и функции

В примере ниже мы создали функцию fun , которая принимает целое число x и исполняется с задержкой в x секунд. Потом мы обернули tqdm вокруг функции range , которая будет запускать цикл на 10 итераций. Для выполнения первой итерации потребуется 0 секунд. Вторая итерация займет 1 секунду, и так далее. Для завершения цикла потребовалось 45 секунд, и мы при этом видим анимированный индикатор выполнения.

from tqdm import trange, tqdm from time import sleep # функция с задержкой исполнения def fun(x): sleep(x) return x # цикл с прогресс-баром for i in tqdm(range(10)): fun(i)
100%|██████████| 10/10 [00:45

tqdm.notebook в списке

А здесь будем использовать модуль tqdm.notebook для отображения прогресс-баров в Jupyter Notebook с помощью виджетов Ipython.

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

from tqdm.notebook import tqdm colors = ["Blue", "Green", "Yellow", "White", "Gray", "Black"] for x in tqdm(colors): sleep(1) print(x)

Несколько индикаторов выполнения

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

  • trange – это комбинация из функции tqdm , обёрнутой вокруг функции range .
  • Внешний цикл будет выполняться за 10 итераций с задержкой 0,01 сек.
  • desc используется для обозначения индикатора выполнения.
  • Внутренний цикл будет выполняться за 10 000 итераций с задержкой 0,001 сек.

Посмотрите, насколько круто выглядит анимация! Скопируйте код ниже, подшаманьте над ним немного на своё усмотрение и запустите.

from tqdm.notebook import trange for i in trange(10, desc="Traning Model on 10 Epochs"): sleep(0.01) for x in trange(10000, desc=f"Epoch "): sleep(0.001)

tqdm для Data Science

В этой части мы соединим функционал библиотек tqdm и pandas и с помощью progress_apply применим функцию к датафрейму, чтобы добавить прогресс-бар.

Загружаем датасет

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

Набор содержит 119390 строк с данными о бронирований номеров в городских гостиницах и курортных отелях в период с 1 июля 2015 года по 31 августа 2017 года, включая фактически прибывшие и отмененные бронирования.

import pandas as pd df = pd.read_csv("hotel_booking.csv") df.head().to_frame()

Применение функции с помощью tqdm

Создадим новый столбец user_name с именами клиентов.

  • функция tqdm.pandas нужна для инициализации прогресс-бара в датафрейме. Добавим к нему название Processing the name colum.
  • Функция user_name приводит строку к нижнему регистру и заменяет пробелы на " - ".
  • Применим функцию к датафрейму с помощью .progress_apply() . Она аналогична функции apply() . А для функции map() можно использовать .progress_map() .
  • Отображаем три верхние строки нашего набора данных
# задаём имя прогресс-бару tqdm.pandas(desc="Processing the name column") # преобразование текста def user_name(text): return text.lower().replace(" ","-") # применение функции к столбцу df["user_name"] = df["name"].progress_apply(user_name) # вывод первых трёх строк df.head(3)

Утилита для параллельной обработки

Библиотека tqdm нужна не только для написания прогресс-баров для циклов, в ней есть также утилиты для параллельной обработки, например, функция tqdm.contrib.concurrent .

Давайте попробуем извлечь доменные имена из адресов электронной почты в столбце email .

  • Импортируем process_map из tqdm.contrib.concurrent .
  • С помощью функции provider_extraction разделим текст сначала по знаку " @ ", затем по знаку " . ".
  • Применяем функцию process_map к столбцу email . В качестве параметров укажем max_worker , равный 8, основываясь на количестве ядер процессора, и зададим chunksize , равный 64.
  • Добавим имя прогресс-бара и настроим его цвет — пусть будет зелёный.
  • Выводим первые пять строк столбца email_provider .
from tqdm.contrib.concurrent import process_map # функция для извлечения email def provider_extraction(email): return email.split("@")[1].split(".")[0] # применения функции к столбцу df["email_provider"] = process_map( provider_extraction, df["email"], max_workers=8, chunksize=64, desc="Extracting Email provider", colour='green' ) df["email_provider"].head().to_frame()

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

Сколько итераций в секунду у python

Cipesta. → The Hidden Impact of CP

Le_Gusto → Thoughts on Round 928 (Div. 4)

macaquedev → Cheating

tiger2005 → Introduction to CPLib — Modern C++ Library for Test Data in CP

mesanu → Codeforces Round 928 (Div. 4) Editorial

Некропост

awoo → Разбор Educational Codeforces Round 70

Sergio86 → Идея решения?

L_Wave → Calculating Riordan Array T(n,k) In O(1) Time

FairyWinx → Codeforces Round #926 (Div. 2) Разбор.

optimize_ofast → My tutorial of "Codeforces Round 927 (Div. 3) A. Thorns and Coins"

wasif1607 → Issue in question A. Lucky Numbers (1808A)

Imtiaz.axi → Long long division.

Vlad_-_null_vampir_best_ → как вам регион по математике?

pashka → Codeforces Round 927 (Div. 3)

secret_name → Is 26 year old late to start CP?

pvtr → Invitation to Alkhwarizm and Starters 122 (Rated till 6-Stars) — 21st February

Некропост

saar2119 → unordered_map vs map in C++ — Complexity Analysis

satyam343 → think-cell Round 1 Editorial

JiaY19 → Rated winner of last round cheated

flamestorm → Codeforces Round 928 (Div. 4)

Vladosiya → Codeforces Round #925 (Div. 3) Разбор

Wasif_Shahzad → Desperate need of help and motivation

G eothermal → I'm Geothermal. AMA!

E legia → How to composite (some) polynomials faster?

BucketPotato → Bay Area Programming Contest 2024

Python Необходимо чтобы в секунду цикл выполнялся не более 20 раз

Зависит от точности, которая вам нужна: если достаточно обойтись sleep - то используйте его, если нужно точнее - то подсчитывайте число выполнений.

15 ноя 2018 в 6:43

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Можно выполнить 20 итераций одну за другой и подождать пока секунда закончится (если необходимо), а затем повторить сначала (псевдо-код):

from time import monotonic as timer N = 20 # the number of iterations INTERVAL = 1 # seconds while True: start = timer() # remember when the loop starts for _ in range(N): do_something() elapsed = timer() - start # find out how long it takes if elapsed < INTERVAL: time.sleep(INTERVAL - elapsed) # wait until the interval ends 

Таким образом за секунду происходит не более 20 итераций и время в ожидании только по необходимости происходит.

Если хочется равномерно распределить каждую итерацию, чтобы каждая итерация начиналась бы на границе INTERVAL / N секунд (1/20 ~ 50 миллисекунд), то при условии, что do_something() занимает меньше 50 миллисекунд это легко сделать:

interval = INTERVAL / N for _ in range(N): do_something() time.sleep(interval - timer() % interval) 

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

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

from threading import Thread def rate_limited_work(rate_limit=RatedSemaphore(N, INTERVAL)): while True: with rate_limit: do_something() for _ in range(N): Thread(target=rate_limited_work).start() 

Код выполняет одновременно N вызовов rate_limited_work функции, каждый в своём потоке. rate_limit семафор гарантирует, что не более N вызовов do_something() будут за INTERVAL секунд (не более 20 вызовов за секунду для данного вопроса).

Если работа в do_something() ограничена I/O или происходит в Си расширениях, которые GIL отпускают, то потоки могут эффективно ресурсы машины использовать в CPython.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *