Почему timeit.timeit выдает ошибку при использовании с переменной? - PullRequest
0 голосов
/ 03 сентября 2018

Я пытался выполнить один фрагмент кода, чтобы узнать, сколько времени требуется для выполнения. Я попробовал две альтернативы, чтобы сделать это. Одним из них является использование переменной внутри функции timeit.timeit и проверка. А другой напрямую использует значение и проверку. Второй подход работает нормально, но я сталкиваюсь с некоторой проблемой определения объема при использовании первого. Прилагаются изображения для обоих сценариев. Using Variable inside timeit function

Using Value inside timeit

Может ли кто-нибудь помочь мне в этом отношении? Любые предложения к вопросам высоко ценятся.

Ответы [ 4 ]

0 голосов
/ 03 сентября 2018

Другие уже рассмотрели основную проблему (код, который вы передаете timeit(), недействителен), я просто хотел упомянуть, что с помощью общедоступного решения (добавление точки с запятой между двумя операторами) вы в конечном итоге проведете сравнительный анализ общая стоимость обоих операторов вместе (создание литеральной строки "Hello world", присвоение ее переменной и вызов endswith('d') для этой переменной). Предполагая, что вас на самом деле интересует только стоимость второго оператора, вы можете использовать timeit() второй (необязательный) аргумент «setup», с которым можно выполнить код до . выполнение проверенного кода, а именно:

import timeit
timeit.timeit("s.endwith('d')", "s = 'Hello World'", number=10000)

, который выполнит оба оператора, но сравнит только первый.

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

timeit.timeit("re.search(r'42', 'hello world')", "import re")

или из вашего текущего скрипта или сеанса интерактивной оболочки:

$ python
Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo():
>>>    return 42
>>> import timeit
>>> timeit.timeit("foo()", "from __main__ import foo")
0 голосов
/ 03 сентября 2018

Полагаю, у вас нет такого большого опыта программирования на python, иначе SyntaxError был бы достаточно понятен. Данное исключение гласит, что синтаксис (т. Е. Строки кода) недействителен.

Действительный ( Составной оператор ) код. Но сложнее читать, поэтому не рекомендуется:

s='Hello world'; s.endswith('d')

Неверный код:

s='Hello world'  s.endswith('d')

Последний вызовет исключение, которое попытается выделить точное местоположение того места, где вызвано исключение, с помощью ^.

s='Hello world'  s.endswith('d')
  File "<stdin>", line 1
    s='Hello world'  s.endswith('d')
                     ^
SyntaxError: invalid syntax

Для тестирования небольших кусочков кода с помощью timeit вы можете поместить код в функцию и вызвать ее. Например:

import timeit

def test():
    s = 'Hello world'
    s.endswith('d')


if __name__ == '__main__':
    t = timeit.Timer('test()', setup='from __main__ import test')
    num_of_repeat = 1000
    runs = t.repeat(repeat=num_of_repeat, number=1)
    print('Fastest run of {3} repeats: {0}ms  Slowest: {1}ms  Average: {2}ms'.format(
        min(runs) * 1000, max(runs) * 1000, (sum(runs) / float(len(runs))) * 1000, num_of_repeat))

Поместите это в файл с именем mytest.py и запустите из командной строки:

python mytest.py
0 голосов
/ 03 сентября 2018

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

import timeit
code = """
s = 'Hello world'
s.endswith('d')
"""
timeit.timeit(code, number=10000)
0 голосов
/ 03 сентября 2018

Проблема в том, что s = 'Hello World' и s.endswith('d')

- это два отдельных утверждения, поэтому либо они должны быть в разных строках, либо они должны разделяться точкой с запятой

Так что измените его на

timeit.timein("s = 'Hello World'; s.endswith('d')",number=10000)
...