Що таке% timeit у python?


96

Я завжди читаю код, щоб розрахувати час так:

%timeit function()

Ви можете пояснити, що тут означає "%"?

Я думаю, "%" завжди використовується для заміни чогось у рядку, як% s означає замінити рядок,% d замінити дані, але я не маю уявлення про цей випадок.


16
Це чарівна команда від iPython. Див .: iPython Magics
MrAlexBailey

Відповіді:


91

%timeitце магічна функція ipython , яка може використовуватися для вимірювання часу на певний фрагмент коду (окремий оператор виконання або один метод).

З документів:

% часу

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

Щоб використовувати його, наприклад, якщо ми хочемо з’ясувати, чи xrangeє використання швидшим, ніж використання range, ви можете просто зробити:

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

І ви отримаєте терміни для них.

Основною перевагою %timeitє:

  • що вам не потрібно імпортувати timeit.timeit зі стандартної бібліотеки , і запускати код кілька разів, щоб зрозуміти, який найкращий підхід.

  • % timeit автоматично розрахує кількість запусків, необхідних для вашого коду, на основі загального вікна виконання 2 секунди.

  • Ви також можете використовувати поточні змінні консолі, не передаючи цілий фрагмент коду, як у випадку з timeit.timeitпобудовою змінної, яка побудована в іншому середовищі, яке працює timeit.


1
чи є спосіб приурочити макрос або набір рядків із оболонки ipython?
alpha_989

2
@ alpha_989 Так, ви можете обернути ці набори рядків у межах функції, а потім визначити час функції, наприклад:%timeit function()
mu 無

@mu 無: Будь ласка, поясніть timer.timeit- це справжня назва модуля?
fountainhead


вихідні дані 10000 loops, best of 3: 29.6 µs per loopможна інтерпретувати як: (1.) вираз виконується 10000 разів, щоб отримати загальний час (2.), тоді загальний час ділиться на 10000, щоб отримати час "на цикл", і (3.) виконано обчислення загального часу 3 рази і, нарешті, (4.) із 3 загальних разів, як вихідний результат використовується мінімальний загальний час (він же "найкращий із 3"). чи моє тлумачення правильне, так / ні?
Тревор Бойд Сміт

37

Це відоме як лінійна магія в iPython. Вони унікальні тим, що їх аргументи поширюються лише на кінець поточного рядка, а самі магії дійсно структуровані для розробки командного рядка. timeitвикористовується для хронометражу виконання коду.

Якщо ви хотіли побачити всю магію, яку ви можете використовувати, ви можете просто набрати:

%lsmagic

отримати список як лінійної магії, так і клітинної магії.

Деякі додаткові магічні відомості з документації тут :

IPython має систему команд, яку ми називаємо магією, яка ефективно забезпечує міні-мову команд, яка є ортогональною синтаксису Python і розширюється користувачем новими командами. Магія призначена для друку в інтерактивному режимі, тому вони використовують конвенції командного рядка, такі як використання пробілів для розділення аргументів, тире для опцій та інших умов, типових для середовища командного рядка.

Залежно від того, перебуваєте ви в лінійному режимі чи в режимі стільникового зв'язку , можна використовувати два різні способи %timeit. Ваше запитання ілюструє перший спосіб:

In [1]: %timeit range(100)

проти

In [1]: %%timeit 
      : x = range(100)
      :


2

Я просто хотів би додати ще одну корисну перевага використання% timeit для відповіді на мю無, що:

  • Ви також можете використовувати поточні змінні консолі, не передаючи весь фрагмент коду, як у випадку timeit.timeit, для побудови змінної, яка вбудована в інше середовище, яке працює timeit.

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


1
Ви також можете редагувати відповідь когось іншого, щоб покращити її. У вас для цього вже повинно бути достатньо репутації
Тарік Веллінг,

Спасибі цього не знали. @TarickWelling
Ankit Agrawal

2

Я просто хотів додати дуже тонкий момент про %% timeit. З огляду на те, що він запускає "магію" на комірці , ви отримаєте помилку ...

UsageError: функцію магічної лінії %%timeitне знайдено

... якщо над %% timeit є будь-який рядок коду / коментаря. Іншими словами, переконайтеся, що %% timeit - це перша команда у вашій комірці.

Я знаю, що це невеликий момент, на який всі експерти скажуть, але я просто хотів додати свої півцента для молодих чарівників, починаючи з магічних фокусів.


1
Це не стосується оболонки iPython, лише в блокноті
Юпітера

0

Магія рядків має префікс символу % і працює подібно до викликів командного рядка ОС: вони отримують як аргумент решту рядка, де аргументи передаються без дужок або лапок. Магія комірок має префікс з подвійним %% , і це функції, які отримують як аргумент не тільки решту рядка, але й рядки під ним в окремому аргументі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.