У меня есть сценарий Python, который работает так же, как и должен, но мне нужно написать время выполнения. Я погуглил, что мне следует использовать, timeit
но я не могу заставить его работать.
Мой скрипт на Python выглядит так:
import sys
import getopt
import timeit
import random
import os
import re
import ibm_db
import time
from string import maketrans
myfile = open("results_update.txt", "a")
for r in range(100):
rannumber = random.randint(0, 100)
update = "update TABLE set val = %i where MyCount >= '2010' and MyCount < '2012' and number = '250'" % rannumber
#print rannumber
conn = ibm_db.pconnect("dsn=myDB","usrname","secretPWD")
for r in range(5):
print "Run %s\n" % r
ibm_db.execute(query_stmt)
query_stmt = ibm_db.prepare(conn, update)
myfile.close()
ibm_db.close(conn)
Мне нужно время, необходимое для выполнения запроса и записи его в файл results_update.txt
. Цель состоит в том, чтобы протестировать оператор обновления для моей базы данных с различными индексами и механизмами настройки.
python
testing
timeit
database-tuning
Mestika
источник
источник
timeit
? Я думаю, нет. В этом случае вам, вероятно, следует удалить «with time of Pythons timeit» из заголовка.Ответы:
Вы можете использовать
time.time()
илиtime.clock()
до и после блока, который вы хотите время.Этот метод не так точен, как
timeit
(он не усредняет несколько прогонов), но он прост.time.time()
(в Windows и Linux) иtime.clock()
(в Linux) недостаточно точны для быстрых функций (итоговое значение = 0). В этом случае или если вы хотите усреднить время, затраченное на несколько запусков, вы должны вручную вызвать функцию несколько раз (как я думаю, вы уже делаете в своем примере код, а timeit выполняет это автоматически, когда вы устанавливаете аргумент number )В Windows, как сказал Кори в комментарии,
time.clock()
точность гораздо выше (микросекунда вместо секунды) и предпочтительнееtime.time()
.источник
timeit.default_timer
; Python уже сделал всю работу за вас. Но на самом деле вы должны использоватьtimeit.timeit(myfast, number=n)
вместо повторного изобретения колеса повторяющихся вызовов (и упустить тот факт, чтоtimeit
отключает сборщик мусора при повторном запуске кода).Если вы профилируете свой код и можете использовать IPython, у него есть волшебная функция
%timeit
.%%timeit
действует на клетки.источник
Помимо времени, этот код, который вы показываете, просто неверен: вы выполняете 100 соединений (полностью игнорируя все, кроме последнего), а затем, когда вы делаете первый вызов execute, вы передаете ему локальную переменную,
query_stmt
которую вы инициализируете только после execute вызов.Во-первых, исправьте ваш код, не беспокоясь о времени: то есть функция, которая устанавливает или получает соединение и выполняет 100 или 500 или любое другое количество обновлений для этого соединения, а затем закрывает соединение. Как только ваш код работает правильно, вы должны подумать об использовании
timeit
этом!В частности, если вы хотите
foobar
использовать функцию time без вызова параметров, вы можете использовать timeit.timeit (2.6 или более поздняя версия - более сложная в 2.5 и более ранних версиях ):Вам лучше указать количество запусков, потому что значение по умолчанию (миллион) может быть высоким для вашего варианта использования (что приводит к потере большого количества времени в этом коде ;-).
источник
foobar
находится в главном файле. Как это:timeit.timeit('foobar()','from __main__ import foobar',number=1000)
timeit.timeit( foobar, number=1000 )
Сосредоточьтесь на одной конкретной вещи . Дисковый ввод / вывод медленный, поэтому я бы выбрал его из теста, если все, что вы собираетесь настроить, - это запрос к базе данных.
И если вам нужно рассчитать время выполнения вашей базы данных, вместо этого ищите инструменты базы данных, такие как запрос плана запроса, и обратите внимание, что производительность зависит не только от конкретного запроса и того, какие у вас индексы, но также и от загрузки данных (сколько данных вы сохранили).
Тем не менее, вы можете просто поместить свой код в функцию и запустить эту функцию с помощью
timeit.timeit()
:Это отключит сборку мусора, повторно вызовет
function_to_repeat()
функцию иtimeit.default_timer()
определит время общей продолжительности этих вызовов , что является наиболее точным из доступных часов для вашей конкретной платформы.Вы должны удалить код настройки из повторяющейся функции; Например, сначала вы должны подключиться к базе данных, а затем только к запросам. Используйте
setup
аргумент для импорта или создания этих зависимостей и передачи их в вашу функцию:хватал глобалов
function_to_repeat
,var1
иvar2
от вашего сценария и передать те функции каждого повторения.источник
eval
ing не собирается летать ни за что не совсем тривиально. ТНХЯ вижу, что на вопрос уже дан ответ, но все же хочу добавить мои 2 цента за то же самое.
Я также столкнулся с подобным сценарием, в котором я должен проверить время выполнения для нескольких подходов и, следовательно, написать небольшой скрипт, который вызывает timeit для всех написанных в нем функций.
Сценарий также доступен как GitHub суть здесь .
Надеюсь, это поможет вам и другим.
источник
Вот простая оболочка для ответа Стивена. Эта функция не выполняет повторные прогоны / усреднения, просто избавляет вас от необходимости повторять код синхронизации везде :)
источник
Пакет тестирования не пытается использовать импортированный файл,
timeit
поэтому трудно сказать, что было задумано. Тем не менее, это канонический ответ, так что полный примерtimeit
выглядит по порядку, подробно останавливаясь на ответе Мартин .В документах для
timeit
предлагает много примеров и флагов стоят проверить. Основное использование в командной строке:Запустите с,
-h
чтобы увидеть все варианты. Python MOTW имеет большой разделtimeit
котором показано, как запускать модули с помощью импорта и многострочных строк кода из командной строки.В форме сценария я обычно использую это так:
Вы можете довольно легко добавить нужные вам функции и аргументы. Соблюдайте осторожность при использовании нечистых функций и заботьтесь о состоянии.
Пример вывода:
источник
Еще один простой пример:
источник