3

私は主に好奇心からこの質問をしています。非常に時間のかかる作業を行うコードをいくつか書きました。そのため、主力関数を実行する前に、time.clock() を 2 回呼び出してまとめました。次のようになります。

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

これはうまくいきました。私の関数は正しく戻り、約 16 分t2 - t1という結果になりました。972.29

ただし、コードをこれに変更すると

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

私の関数はまだ正常に返されましたが、結果は次のt2 - t1とおりでした:

None
-1741

実装の詳細がこれを引き起こしていることに興味があります。None と負の数の両方が私を当惑させます。署名された型と関係がありますか?これはどのように説明しNoneますか?

4

3 に答える 3

17

Pythonのドキュメントには次のように書かれています:

Unix では、現在のプロセッサ時間を秒単位の浮動小数点数として返します。精度、そして実際には「プロセッサ時間」の意味の定義そのものは、同名の C 関数の精度に依存します。

次に、参照されている C 関数のマンページで問題が説明されています。

時間が前後する可能性があることに注意してください。CLOCKS_PER_SEC が 1000000 に等しい 32 ビット システムでは、この関数はほぼ 72 分ごとに同じ値を返します。

于 2010-07-20T18:05:04.280 に答える
2

簡単な推測...オーバーフローのように見えます。デフォルトのデータ型はおそらく符号付きデータ型です(符号付き整数の最初のビットを1にすると、負の数になります)。

減算の結果を変数(double)に入れて、それを出力してみてください。

それでもそのように印刷される場合は、doubleからstringに変換してから、文字列に対して「print」関数を使用してみてください。

于 2010-07-20T17:58:23.527 に答える
1

None には非常に単純な答えがあり、関数は値を返しません。実際には、通常の状況ではそうであると収集しますが、how_long_parameter = 80の場合はそうではありません。関数が早期に返されているように見えるため(おそらく、実行がPythonで暗黙的な戻りNoneがある関数の最後に達したため)、負の時間はこの場合、関数が完了するのにほとんど時間がかからないからですか? したがって、関数のバグを探して修正してください。

負の時間を取得する理由に関する実際の答えは、使用しているオペレーティング システムによって異なります。これは、clock() の実装がプラットフォームによって異なるためです。Windows では QueryPerformanceCounter() を使用し、*nix では C 関数 clock() を使用します。

于 2010-07-20T18:04:38.020 に答える