Время нахождения встроенной функции sum [duplicate]

Случай, когда примечание [] полезно:

Если ваш объект является динамическим, и могут быть некоторые случайные значения в таких ключах, как number и [] или любой другой специальный символ, например -

var a = { 1 : 3 };

Теперь, если вы попытаетесь получить доступ, как a.1, он будет через ошибку, потому что он ожидает строку там.

76
задан Kyle Cronin 16 February 2009 в 00:26
поделиться

5 ответов

Измените эту строку:

t = timeit.Timer("foo()")

К этому:

t = timeit.Timer("foo()", "from __main__ import foo")

Проверьте ссылку, которую вы указали в самом низу.

] Чтобы предоставить модулю timeit доступ к определенным вами функциям, вы можете передать параметр настройки, который содержит оператор импорта:

Я только что протестировал его на своей машине и работал с изменениями.

83
ответ дан Melebius 24 August 2018 в 10:24
поделиться
  • 1
    Оно работает! Тем не менее, это довольно глупый дизайн интерфейса, если мне нужно предоставить команду, которую я хочу использовать в качестве строки, и импортировать модуль main , чтобы он работал. – Kyle Cronin 16 February 2009 в 00:21
  • 2
    Пространство имен Python для меня совершенно безумие. Я предполагаю, что это имеет смысл к определенному виду ума, но этот ум не тот, которого я случайно не обладаю. Поблагодарите $ DEITY за Ruby, в моем случае. – womble 16 February 2009 в 07:03
  • 3
    womble, это бородавка, а не общая проблема пространства имен python. Основной поток: writeonly.wordpress.com/2008/09/12/… имеет ссылки на другие обсуждения об этом. – Gregg Lind 19 February 2009 в 00:12
  • 4
    @Gregg Ссылка больше не доступна (ошибка 404). Что было в этой дискуссии? – ovgolovin 13 September 2011 в 23:29
  • 5
    эти ссылки мертвы – endolith 11 August 2013 в 18:33

добавьте в свою настройку «import thisfile;»

, а затем, когда вы вызываете функцию настройки myfunc (), используйте «thisfile.myfunc ()»

, например «thisfile.py»,

def myfunc():

 return 5

def testable(par):

 pass



t=timeit.timeit(stmt="testable(v)",setup="import thisfile; v=thisfile.myfunc();").repeat(10)

print( t )
0
ответ дан Benjamin 24 August 2018 в 10:24
поделиться
t = timeit.Timer("foo()", "from __main__ import foo")

Поскольку timeit не имеет ваших данных в области видимости.

8
ответ дан dwc 24 August 2018 в 10:24
поделиться

Вы можете попробовать этот взлом:

import timeit

def foo():
    print 'bar'

def dotime():
    t = timeit.Timer("foo()")
    time = t.timeit(1)
    print "took %fs\n" % (time,)

import __builtin__
__builtin__.__dict__.update(locals())

dotime()
19
ответ дан Luka Zakrajšek 24 August 2018 в 10:24
поделиться
  • 1
    Этот хак отлично подходит, если вам понадобится сложный код установки. – Luís Marques 4 July 2011 в 00:19
  • 2
    Лучше, чем альтернативный код запуска, указанный в других ответах (то есть лучше, чем t = timeit.Timer("foo()", "from __main__ import foo")). Специально, если вы хотите протестировать несколько разных функций, это сэкономит много информации! – A.Sommerh 28 July 2014 в 08:30
  • 3
    У меня около 20 импорта, поэтому передача их в качестве аргумента становится беспорядочной. Это взломать! – kramer65 24 December 2014 в 09:08
  • 4
    Большой! На python3 вам нужны import builtins и 'builtins .__ dict __. Update (locals ())' – greole 24 February 2016 в 08:46

Вы можете использовать globals=globals()

t = timeit.Timer("foo()", globals=globals())

Из документации :

Другой вариант - передать globals() на globals, что приведет к выполнению кода в текущем глобальном пространстве имен. Это может быть более удобным, чем индивидуальное определение импорта

8
ответ дан user2314737 24 August 2018 в 10:24
поделиться
  • 1
    Работает только для Python 3. globals не параметр для Python 2's timeit – tony_tiger 30 October 2017 в 07:25
Другие вопросы по тегам:

Похожие вопросы: