Я задаю этот вопрос в основном из любопытства. Я написал некоторый код, который выполняет очень трудоемкую работу. Итак, перед выполнением моей функции рабочей лошадки я обернул ее в пару вызовов 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
Wilduck 20 Июл 2010 в 21:55

3 ответа

Лучший ответ

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

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

man-страница упомянутой функции C затем объясняет проблему:

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

17
sth 20 Июл 2010 в 18:05

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

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

1
Eloff 20 Июл 2010 в 18:04

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

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

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

2
Wadih M. 20 Июл 2010 в 17:58