Что такое% timeit в Python?

97

Я всегда читаю код, чтобы рассчитать время следующим образом:

%timeit function()

Вы можете объяснить, что здесь означает "%"?

Я думаю, что "%" всегда используется для замены чего-либо в строке, например,% s означает замену строки,% d заменяет данные, но я понятия не имею об этом случае.

xirururu
источник
16
Это волшебная команда от iPython. Смотрите: iPython Magics
MrAlexBailey

Ответы:

91

%timeit- это волшебная функция ipython , которая может использоваться для измерения времени определенного фрагмента кода (одного оператора выполнения или одного метода).

Из документов:

% timeit

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.

mu 無
источник
1
есть ли способ синхронизировать макрос или набор строк из оболочки ipython?
alpha_989
2
@ alpha_989 Да, вы можете обернуть этот набор строк внутри функции, а затем задать время для функции, например:%timeit function()
mu 無
@mu 無: Уточните, пожалуйста timer.timeit, это настоящее имя модуля?
fountainhead
2
@fountainhead: docs.python.org/3/library/timeit.html#timeit.timeit
Саша Чедыгов
вывод 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 и расширяемый пользователем с помощью новых команд. Magics предназначены для интерактивного ввода, поэтому они используют соглашения командной строки, такие как использование пробелов для разделения аргументов, тире для параметров и других соглашений, типичных для среды командной строки.

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

In [1]: %timeit range(100)

vs.

In [1]: %%timeit 
      : x = range(100)
      :
Мирадуло
источник
2

Я просто хотел бы добавить еще одно полезное преимущество использования% timeit для ответа на мю無, что:

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

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

Анкит Агравал
источник
1
Вы также можете отредактировать ответ другого человека, чтобы улучшить его. У тебя уже должно быть достаточно репутации для этого,
Тарик Веллинг
Спасибо, не знал этого. @TarickWelling
Анкит Агравал
2

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

UsageError: магическая функция линии %%timeitне найдена

... если есть какие-либо строки кода / комментариев выше %% timeit. Другими словами, убедитесь, что %% timeit - первая команда в вашей ячейке.

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

успешный
источник
1
Это не применимо в оболочке iPython, только в блокноте
Jupyter
0

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

Мохаммад Салехи
источник