このPythonプログラムのCPU使用率を下げるにはどうすればよいですか?


15

whileループでPythonを24時間365日実行させます。プログラムの例を次に示します。

while True:

    print ("me again...")

しかし、実行すると、CPUは100%になります!しかし、プログラムが長時間実行されるなどのために、CPUが非常に熱くなることを望まないので、それを防ぐことができますか?


3
CPUが待機することなく100%になります。なぜなら、それがあなたがそうするように言ったからです:)可能な限り速く印刷します。待つことで、その負担を軽減できます。印刷は、一般的に非常に高価な操作です。ファイルへの書き込みははるかに安価です。
ピョートルクラ

一定期間CPUサイクルが不要であることをオペレーティングシステムに伝える必要があります。そうしないと、表示されていることを避けるために何もできません。
トールビョーンラヴンアンデルセン

回答:


16

ループの終わりに

time.sleep(xx)秒、またはtime.sleep(x.x)部分的な秒を表す

(そうのように、ライブラリの時間をインポートすることを忘れないでください。import time

xxは、プログラムに悪影響を与えることなく、可能な限り高くします。現在、あなたのプログラムは、Piが休んだり他のことをするための時間を与えるのではなく、可能な限り高速ですべてを常に実行しています。


うーん...非常に興味深い...私はそれを試してみます。ありがとう!信じられませんでした
user151324

インポートする必要があるライブラリなどはありますか?私は時間が定義されていないというエラー取得しています
user151324

@coding_corgiはい、タイムライブラリが必要です。
バター

2
だからimport time
user151324

@coding_corgi。はい、それは正しいです。
バター

14

序文

タスクを繰り返し実行する必要があることを確認してください。これはビジー待機と呼ばれ、ほとんど常に最適ではありません。タスクがサブプロセスの出力をチェックしている場合、たとえば、サブプロセスの出力を確認するだけで済みますsubprocess.wait()。ファイルシステム内のファイルまたはディレクトリがタッチされるのを待つことがタスクの場合、pyinotifyを使用して、カーネルが処理するファイルシステムイベントからコードをトリガーできます。

回答

これは、CPUを過度に消費せずにビジー待機のために無限ループを作成する方法です。

Python 2:

from __future__ import print_function
from __future__ import division

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

Python 3:

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

評価

@gnibblerが別の回答テストしたように、提示されたコードは最近のマシンで1%を超えるCPUを消費するべきではありません。それでもペイロードコードでCPUを消費しすぎる場合は、スリープ時間をさらに長くすることを検討してください。一方、ペイロードコードは、繰り返し実行するために最適化する必要があります。たとえば、キャッシュにより、変更されていないデータの実行を高速化できます。

クレジット

この回答は、@ user2301728の回答に基づいて作成しようとします



1

試すこともできnice -n 19 python myscript.pyます。

niceは、タスクのCPU優先度を設定する* nixユーティリティです。19は最大の重みであり、結果として最も遅い設定です。


2
いいえ。プロセスの良さを高めることは、他のプロセスがCPUをより頻繁に取得できるようにすることによってのみ役立ちます。他のプロセスが存在しない場合、OPのコードはCPUを100%使用し、存在する場合はCPUを使用し、合計で100%になります。
ベングト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.