Моя функция занимает отрицательное время для завершения. Что в мире произошло? - PullRequest
3 голосов
/ 20 июля 2010

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

t1 = time.clock()
print this_function_takes_forever(how_long_parameter = 20)
t2 = time.clock()
print t2 - t1

Это сработало нормально. Моя функция вернулась правильно и t2 - t1 дал мне результат 972.29, или около 16 минут.

Однако, когда я изменил свой код на этот

t1 = time.clock()
print this_function_takes_forever(how_long_parameter = 80)
t2 = time.clock()
print t2 - t1

Моя функция все еще возвращалась нормально, но результат t2 - t1 был:

None
-1741

Мне любопытно, какие детали реализации вызывают это. И None, и отрицательное число сбивают меня с толку. Это как-то связано с типом со знаком? Чем это объясняет None?

Ответы [ 3 ]

17 голосов
/ 20 июля 2010

Документы Python говорят:

В Unix возвращает текущее время процессора в виде числа с плавающей запятой, выраженного в секундах.Точность и, собственно, само определение значения «процессорного времени» зависит от точности функции C с таким же именем

manpage упомянутого CЗатем функция объясняет проблему:

Обратите внимание, что время может меняться.В 32-битной системе, где CLOCKS_PER_SEC равен 1000000, эта функция будет возвращать одно и то же значение примерно каждые 72 минуты.

2 голосов
/ 20 июля 2010

Быстрое предположение ... Похоже на переполнение.Тип данных по умолчанию, вероятно, является типом данных со знаком (если первый бит равен 1, то целое число со знаком дает отрицательное число).

Попробуйте поместить результат вычитания в переменную (double), а затем напечатайтеthat.

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

1 голос
/ 20 июля 2010

None имеет очень простой ответ, ваша функция не возвращает значение.На самом деле я понимаю, что это происходит при нормальных обстоятельствах, но не тогда, когда how_long_parameter = 80. Поскольку ваша функция, кажется, возвращается рано (возможно, потому что выполнение достигает конца функции, где есть неявный возврат None в Python), отрицательное время может бытьпотому что ваша функция почти не занимает времени в этом случае?Поэтому найдите ошибку в своей функции и исправьте ее.

Фактический ответ о том, почему вы получаете отрицательное время, зависит от используемой операционной системы, потому что clock () реализована по-разному на разных платформах.В Windows он использует QueryPerformanceCounter (), в * nix - функцию C clock ().

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