Вывод ответа #1863809483

-

Ноу хау - от мастеров на заметку

Небольшие рецепты полезных решений

Virtuos86


Репутация: 101
репутация: 101
| на сайте с 2008 года | последнее посещение: 07:03 17 ноя 2024
сообщений: 802

Пост № 1863809483

Примерчик-то не совсем корректный, dimy44, а winked? Ты же понимаешь, что сто тыщ раз вызывать конструктор пусть даже неизменяемого типа, как кортеж, влечет накладные расходы.

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

def foo(): pass



def func():

from time import clock # локальный импорт; дергать модуль из глобальной области видимости в цикле в функции для замера производительности плохая идея

funcs = [foo, lambda: None]

## если список функций "func" не локальный, то можно сделать локальную ссылку на него, тоже ускорит доступ к нему и к функциям:

## local_funcs = func

p = 0

t= clock()

while p < 100000:

funcs[0]()

p += 1

result = clock() - t # сразу выводить результат плохо, потому что неизвестно, сколько работы-времени тратится на поиск текущего объекта вывода (sys.stdout)

print 'example #1: %f sec.' % result





def func1():

from time import clock

local_foo = foo

## обязательно нужно создать локальную ссылку, ведь в "func" с помощью

## funcs = [foo, lambda: None]

## ускоряется доступ к функциям

p = 0

t = clock()

while p < 100000:

if p >= 0:

local_foo()

p += 1

result = clock() - t

print 'example #2: %f sec.' % result



func()

func1()



# example #1: 1.984375 sec.

# example #2: 2.125000 sec.



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

## Несущественное, имхо.



# wbr, Virtuos86



Прикрепленный файл #1: 452_synthetic_tests.zip | скачать с зеркала | (967 b)
-------------
добавлено в 02.43: '%s' % str(obj) лишняя писанина

%s сам по себе говорит, что к объекту нужно применить функцию str и результат поместить в строку: '%s' % obj

Так же как %r намекает на repr.

А вот уже %d, %i и %f требуют всенепременно число.

---

Да и тесты-то синтетические. В реале редко 100500 раз вызываешь в цикле функцию. Нужно в каждом конкретном случае решать, сэкономить на лишнем коде, или на скорости его выполнения. Редко более краткий вариант бывает более быстрым. За исключением встроенных функций и модулей расширений, ну и списковых встраиваний.


ответ опубликован:
Рейтинг: 5
голосов: 2