Подводные камни в профиле Python - PullRequest
2 голосов
/ 10 июля 2011

Я новичок, только начинающий профилировать мой код, и был озадачен, почему истекшее время, указанное в cProfile, было так сильно отличается от времени, указанного в time.time ().

# Python 2.7.2

import cProfile

def f(n):
    G = (i for i in xrange(n))
    sum = 0
    for i in G:
        sum += i

num = 10**6

cProfile.run('f(num)')

Это дает 1000004вызовы функций за 2,648 секунды

И все же с помощью time.time () я получаю 0,218000173569 секунд

import time

x = time.time()
f(num)
print time.time() - x

Из того, что я прочитал, я думаю, это может быть связано с издержками cProfile.Существуют ли какие-либо общие советы о том, когда время cProfile может быть очень нестабильным, или о способах получения более точного времени?

Ответы [ 2 ]

3 голосов
/ 10 июля 2011

Смысл профилирования состоит в том, чтобы выяснить, какие части вашей программы занимают больше всего времени и, следовательно, требуют наибольшего внимания.Если 90% времени используется одной функцией, вы должны посмотреть, как сделать эту функцию более эффективной.Не имеет значения, займет ли весь цикл 10 секунд или 1000.

Возможно, самая важная часть информации, которую дает вам профилировщик, - это сколько раз что-то вызывается.Это полезно потому, что оно помогает вам находить места, где вы часто вызываете вещи, особенно если у вас есть вложенные циклы или многие функции, которые вызывают другие функции.Профилировщик поможет вам отследить этот материал.

Накладные расходы на профилирование неизбежны и велики.Но гораздо проще позволить профилировщику делать то, что он делает, чем вставлять свои собственные настройки времени и печатать операторы повсюду.

1 голос
/ 10 июля 2011

Обратите внимание, что cProfile дает вам процессорное время , но использование time.time () дает вам истекшее время (что вам не нужно).

возможно, вы можете попробовать использовать программу unix time .

➜  sandbox  /usr/bin/time -p python profiler.py

real         0.17
user         0.14
sys          0.01

Процессорное время должно быть user + sys

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...