2016-04-25 35 views
1

私は現在for-loopを持っていますが、これは何かをチェックするための驚くべき数の繰り返しを経ています。新しい繰り返しになると、変数があるかどうかをチェックする必要があります現在の反復のサイズと同じです。
ここ は私がやっているのコード例である:私は私の答えを得る前に、それは数学重い操作の可能性の何百万によって起こっているので、しかし毎回変数をチェックしないでください

import datetime 
now = datetime.datetime.now() 
printcounter = 0 
for i in range(3,100000000000+1,2): 
    if (printcounter == 1000000000): 
      print(i,"at %d" %now.hour, "hours and %d" % now.minute, "minutes.") 
      printcounter = 0 
    else: 
      #Do operation 
      printcounter += 1 

、私は気づいた「printcounterのこのコードをストライピングすることにより、 '変数と私に進捗報告を与えていない私は時々、全体的なスピードアップを与えた。

「printercounter」変数が10000に等しいかどうかをチェックする方法はありますか?チェックすることなく、ごとにを繰り返しますか?
私は個人的には、非常に汚れてしまうループの入れ子に頼らずに、とにかく考えることができません。

ところで、私はWindows 8.1、Python 3.5.1を使っています。違いがあれば。

編集:
私はそれは私が代わりにファイルに印刷する場合は、しかし、印刷する時間の大部分を取ることを理解し、私のハードディスクは非常に速いです、そして、私はまだ同じではありますが、時間の差は小さくなりました。また、私はこのソリューションを他の多くのスクリプトで実装したいと思っていました。ここでも大きな問題ではないにしても、やってみたいと思っています。

編集2:
おそらく、それを明確にされていないため私のせいです。私は毎回ではなく、しばらく毎回値をチェックすることが可能かどうかを探していました。たとえば、私は 'printcounter'が1のとき1000000000に等しいかどうかチェックするのは私のコードでは望んでいません。それはばかげています。私は機械が非常に高速に動作することを知っているので、それは問題ではありませんが、それ自体が怠け者であるか怠け者であるかのようなダムコードを持つのではなく、それを訂正するのに十分速いからです。

+0

'if'文があなたの悩みの原因ではありません。 [Pythonコードをプロファイリングする](https://github.com/what-studio/profiling)でこれを見ることができますので、実際にプログラムのどの部分が最も時間を費やしているかを知ることができます。 –

+1

これらの10,000,000件の仲介プログレスレポートを実際に印刷したいですか? O_o –

+0

@Reblochon Masqueそれはすべてを印刷しません、10000回の繰り返しごとにステータスチェックを行います。 –

答えて

2

あなたはそれが不要に、変数ごとの繰り返しをチェックしたくない場合は...

import datetime 

iterations = 100000000000 
subiterations = 10000 
chunks, remaining = divmod(iterations, subiterations) 

now = datetime.datetime.now() 
printcounter = 0 
for i in range(chunks): 
    for j in range(subiterations): 
     #Do operation 
     pass 

    printcounter += subiterations 
    print('{:,d} at {} hours {} minutes'.format(printcounter, now.hour, now.minute)) 

if remaining: 
    for j in range(remaining): 
     #Do operation 
     pass 

    printcounter += remaining 
    print('{:,d} at {} hours {} minutes'.format(printcounter, now.hour, now.minute)) 
+0

どうしたのですか?あなたはそれを馬鹿げた速さにしました。 –

+0

"トリック"は組み込みの['divmod'](https://docs.python.org/3/library/functions.html?highlight=divmod#divmod)関数を使って'(a // b 、 '%b)'変数を増やした回数を決定する( 'subiternations'を実行した後)。そして多くの変数が完了するたびに変数を増やします。 – martineau

+0

ニート:チェーンイテレータのラインに沿って考えていましたが、「チャンク」の間にいくつかの印刷トリガを生成しましたが、これは簡単で優れています。私はそれを盗んでいる! –

1

printcounterは繰り返しごとに増分されるため、入れ子になったforループは使用しないでください。大体このような

何か:

import datetime 
now = datetime.datetime.now() 

for j in range(100): 
    print(j, "at %d" %now.hour, "hours and %d" % now.minute, "minutes.") 
    for i in range(1000000000): 
      #Do operation 
+0

これは非常に興味深いですが、二重のforループはプロセスを大幅に遅くします。 –

+0

'range(3,100000000000 + 1,2/10000)'は 'TypeError'を発生させます。 – martineau

+0

はい、ネストループの概念を説明するためにこのサンプルを用意しました。私はそれを試していないし、確かに、私はその部分を見落とした。 –

2

高速化が原因でその変数をチェックするのではありません。それはprintステートメント自体のためです。そうではありません。その文を削除するだけでなく、それをさらにスピードアップする方法はありません。

あなたの特定の質問に明示的に答えてください:例えば、ネストされたforループを使ってチェックする必要がないようにコードを再構成することができます。しかし、それはおそらく遅くなるでしょう。ブール比較が非常に小さいことを確認するのにかかる時間。

+0

私はそれが非常に小さいことを理解しますが、何百万回も確認しなければならないほど大きくなり、目立つようになり始めます。 –

0

int型の数学は、実際のprint文に比べて小さいので、大きな違いを作ることはないだろう、しかし:

import datetime 


now = datetime.datetime.now() 
step = 2 
init = 3 
for i in range(init, 100000000000+1, step): 
    if (i % 10000*step) == init: #since we start at 3 and step by 2 
     print(i,"at %d" %now.hour, "hours and %d" % now.minute, "minutes.") 
    # Do Stuff 

この構造は、いくつかの操作を排除しますが、それらのどれも遅いの操作ではありません。しかし、コード構造の面では、これは私がそれをやる方法です。代わりに、このような何かを行うことによって

+0

'xrange == range' - これはpython 3 –

+0

ああそうです。私はそれを修正します。 – nephlm

関連する問題