2

次のスクリプトを書きました

基本的に、私は機械学習用のPythonを学習しているだけで、実際に計算量の多いタスクがどのように実行されるかを確認したいと思いました。10 ** 8回の反復で、Pythonは大量のRAM(約3.8 GB)と大量のCPU時間を消費します(システムがフリーズしただけです)。

コードまたはいくつかのグローバル設定のいずれかを介して時間/メモリ消費を制限する方法があるかどうか知りたい

脚本 -

initial_start = time.clock()
for i in range(9):
 start = time.clock()
 for j in range(10**i):
  pass
 stop = time.clock()
 print 'Looping exp(',i,') times takes', stop - start, 'seconds'
final_stop = time.clock()
print 'Overall program time is',final_stop - initial_start,'seconds'
4

5 に答える 5

7

Python 2ではrange、リストを作成します。xrange代わりに使用してください。より詳細な説明については、range()よりもxrange()を常に優先する必要がありますか?を参照してください。

no-op forループは非常に貧弱なベンチマークであり、Pythonについてほとんど何も教えてくれないことに注意してください。

また、gnibblerのコメントによると、Python3はPython2rangeと同じように機能しxrangeます。

于 2012-08-15T19:36:26.170 に答える
2

この質問を見てください:ヒープサイズを制限する方法は?

スクリプトに対処するために、timeitモジュールはアクションをより正確に実行するのにかかる時間を測定します

>>> import timeit
>>> for i in range(9):
...     print timeit.timeit(stmt='pass', number=10**i)
...
0.0
0.0
0.0
0.0
0.0
0.015625
0.0625
0.468752861023
2.98439407349

あなたの例は、あなたがそれを記憶に置いている数の巨大なリストを扱うことにほとんどの時間を費やしています。 xrange代わりにrangeその問題を修正するのに役立ちますが、それでもひどいベンチマークを使用しています。ループは何度も実行され、実際には何も実行されないため、CPUは状態のチェックとループへの参加でビジー状態になります。

ご覧のとおり、これらのリストの作成には、ここでほとんどの時間がかかります。

>>> timeit.timeit(stmt='range(10**7)', number=1)
0.71875405311584473
>>> timeit.timeit(stmt='for i in range(10**7): pass', number=1)
1.093757152557373
于 2012-08-15T19:56:16.483 に答える
2

関数を使用して10**8の長さの非常に大きなリストを作成しているため、PythonはRAMを使用しrangeます。ここでイテレータが役立ちます。

xrangeの代わりに使用してくださいrange

これは同じように機能rangeしますが、メモリ内にその大きなリストを作成する代わりに、xrange内部インデックスを計算するだけです(反復ごとに値を1ずつ増やします)。

于 2012-08-15T19:38:10.390 に答える
1

機械学習にPythonを検討している場合は、numpyをご覧ください。その哲学は、最適化されたCですべての「内部ループ」(行列演算、線形代数)を実装し、Pythonを使用して入力と出力を操作し、Pythonを使用するMatlabのような高レベルのアルゴリズムを管理することです。これにより、Pythonの使いやすさと読みやすさ、Cの速度という両方の長所が得られます。

質問に戻ると、numpyの操作をベンチマークすると、機械学習に対するPythonのパフォーマンスをより現実的に評価できます。

于 2012-08-15T20:44:34.037 に答える
0

CPUに関しては、forループが何十億回も繰り返され、その間にスリープや一時停止が発生しないため、プロセスがCPUを完全に占有するのも不思議ではありません(少なくともシングルコアコンピューターでは)。

于 2012-08-15T19:57:20.337 に答える