7

これら 2 つの if ステートメントの書き方には、パフォーマンスの違いやスタイルの好みがありますか? これは基本的に同じことで、1 つの条件は 1 回だけ満たされ、もう 1 つの条件は 1 回おきに満たされます。1回しか満たされない条件は1番目か2番目か?パフォーマンスに違いはありますか?パフォーマンスが同じなら、私は最初の方法を好みます。

data = range[0,1023]
length = len(data)
max_chunk = 10

for offset in xrange(0,length,max_chunk):
    chunk = min(max_chunk,length-offset)
    if chunk < max_chunk:
        write_data(data[offset:])
    else:
        write_data(data[offset:offset+max_chunk])

data = range[0,1023]
length = len(data)
max_chunk = 10

for offset in xrange(0,length,max_chunk):
    chunk = min(max_chunk,length-offset)
    if not chunk < max_chunk:
        write_data(data[offset:offset+max_chunk])
    else:
        write_data(data[offset:])
4

7 に答える 7

9

あなたの例でifは、まったく必要ありません:

data = range[0,1023]
length = len(data)
max_chunk = 10

for offset in xrange(0,length,max_chunk):
    write_data(data[offset:offset+max_chunk]) # It works correctly

あなたの場合、これが最も効率的な方法だと思います。

于 2012-10-01T20:00:16.820 に答える
7

さて、試してみましょう:

x = np.random.rand(100)

def f(x):
    z = 0
    for i in x:
        if i < 0.5:
            z += 1
        else:
            z += 0
    return z

def g(x):
    z = 0
    for i in x:
        if not (i < 0.5):
            z += 0
        else:
            z += 1
    return z

我々が得る:

%timeit f(x)
10000 loops, best of 3: 141 us per loop
%timeit g(x)
10000 loops, best of 3: 140 us per loop

いいえ、ここではそれほど違いはありません。xが大きくても、違いはごくわずかです。

私は少し驚いていると言わなければなりません。直接バージョン( )はバージョン( )fよりもわずかに効率的であると期待していました。notg

道徳:好きなようにしてください。

于 2012-10-01T20:20:28.350 に答える
5

違いはないと思いますが、READABILITY はパフォーマンスの利点よりも重要だと思います。

したがって、理解しやすいので、最初の方法を使用してください。

于 2012-10-01T19:59:04.447 に答える
2

他の人は、読みやすさが(通常)より重要であり、例が提示されている方法である場合は実際には必要ないと指摘しています。また、 「時期尚早の最適化は諸悪の根源である」という古いのこぎりがあります。

とはいえ、パフォーマンスを確認する最善の方法はテストすることです。したがって、最初の例を「without_not」、2 番目の例を「with_not」という名前の関数 (動作させるために変更) に 2 つの例を入れ、testit モジュールを使用してテストするための簡単なメインを作成range[0,1023]しましrange(0, 1023)

def main():
    global outfile
    outfile = open('test.dat', 'wt')
    num_tests = 10000
    without_timer = timeit.Timer(stmt=without_not)
    with_timer = timeit.Timer(stmt=with_not)
    print 'without result: ', without_timer.timeit(number=num_tests)
    print 'with result: ', with_timer.timeit(number=num_tests)
    outfile.close()

その後、いくつかのテストを実行しました。私や他の回答者が予想していたように、not実行なしのバージョンは、各テストで少し (約 0.6%) 高速でした。心配する必要はありません、IMO。(まあ、それが重要な場合もあるかもしれませんが、その場合は、C または他のコンパイル済み言語をお勧めします。)

于 2012-10-01T20:33:30.097 に答える
2

パフォーマンスの違いはありませんが (もしあったとしても、2 番目のパフォーマンスは低下すると思います)、より明確な方を使用してください。私も最初の方が好きです。:)

後で違いがあることがわかった場合は、先に進んで変更してください。ただし、時期尚早の最適化はすべての悪の根源です。

于 2012-10-01T19:58:28.477 に答える
0

パフォーマンスの違いがある場合は?はい、if-elseステートメントの場合、プロセッサは予測ジャンプを行う必要があります。違いに気づきますか?ありえない。コンパイラ/オプティマイザは、実行前にコードを上下逆にします。あなたの計算は、おそらく数千年もかからないでしょう。おそらくリアルタイムシステムを使用していないでしょう。

他の人が言ったように:読みやすさに焦点を当て、重要でない部分を事前に最適化しないでください

于 2012-10-20T23:42:22.960 に答える
0

これを確認することはできませんが、常識的には、最初のほうがパフォーマンスがわずかに優れていると思います。2 つ目は < を評価し、次に not を評価します。これは 1 つの追加操作です。そして、それは毎回それを行います。さらに直感的には、最初の方が理にかなっています。

于 2012-10-01T19:59:41.690 に答える