Как я могу рассчитать отрезок кода для тестирования производительности с помощью Pythons timeit?

У меня есть скрипт на 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. Цель состоит в том, чтобы протестировать оператор обновления для моей базы данных с различными индексами и механизмами настройки.

140
задан Adam 12 March 2018 в 21:46
поделиться

2 ответа

Вы можете использовать time.time () или time.clock () до и после блока, который вы хотите отсчитать.

import time

t0 = time.time()
code_block
t1 = time.time()

total = t1-t0

Этот метод не так точен, как timeit (он не усредняет несколько прогонов), но он прост.

time.time () (в Windows и Linux) и time.clock () (в Linux) недостаточно точны для быстрых функций (вы получаете total = 0). В этом случае или если вы хотите усреднить время, затраченное на несколько запусков, вам придется вручную вызывать функцию несколько раз (как я думаю, вы уже это делаете в своем примере кода, а timeit выполняет это автоматически, когда вы устанавливаете его номер ] аргумент)

import time

def myfast():
   code

n = 10000
t0 = time.time()
for i in range(n): myfast()
t1 = time.time()

total_n = t1-t0

В Windows, как сказал Кори в комментарии, time.clock () имеет гораздо более высокую точность (микросекунды вместо секунды) и предпочтительнее time.time () .

237
ответ дан 23 November 2019 в 23:14
поделиться

Не говоря уже о времени, этот код, который вы показываете, просто неверен: вы выполняете 100 подключений (полностью игнорируя все, кроме последнего), а затем, когда вы выполняете первый вызов выполнения, вы передаете его локальная переменная query_stmt , которую вы инициализируете только после вызова execute.

Во-первых, исправьте свой код, пока еще не беспокоясь о времени: то есть функция, которая устанавливает или принимает соединение и выполняет 100 или 500 или любое другое количество обновлений для этого соединения, а затем закрывает соединение. Когда ваш код работает правильно, самое время подумать об использовании на нем timeit !

В частности, если функция, которую вы хотите отсчитать, не имеет параметров и называется foobar , вы можете использовать timeit.timeit (2.6 или новее - это сложнее в 2.5 и before):

timeit.timeit('foobar()', number=1000)

Вам лучше указать количество запусков, потому что значение по умолчанию, миллион, может быть большим для вашего варианта использования (что приводит к тому, что вы тратите много времени на этот код ;-).

33
ответ дан 23 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

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