1

私のコードでは、リストは最終的にすべての要素が空になります。私がテストしているのは、すべての要素==''です。

リストのサイズは入力によって異なります。

私が検討していた2つのテストは、等式テストとlist.count()関数の使用です。これは実行時に高速になります。

私はPythonを初めて使用するので、バックグラウンドでの処理方法はあまり馴染みがありません。私の仮定では、比較を行うために各要素を繰り返しチェックしない場合、テスト2の方が高速になります。リスト内のデータは空の文字列から100文字を超える文字列まで変化する可能性があるため、テスト1 count('')によって実行される単純なチェックも非常に高速になる可能性があります。

テスト用の変数を設定するためのサンプルコード。

mylist = [''] * 33
testlist = []
testlist.extend('' * mylist.__len__())
testlist.count('')
33
mylist.count('')
33

次のテストのどれが速くなるでしょう。

テスト1

if mylist.count('') == 33:
    do some thing

while mylist.count('') !=33:
    do some thing

テスト2

if mylist == testlist:
    do some thing

while mylist != testlist:
    do some thing
4

1 に答える 1

1

実際に解決しようとしている問題については説明していませんが、リストエントリを空の文字列に設定して、それらを完了としてマークし、再度処理しないようにしていますか?

その場合は、別のデータ構造を使用することで、より良い結果が得られる可能性があります。たとえば、アイテムを使い終わったらsetremoveアイテムを使用できます。次に、セットが空であるかどうかをテストするだけで済みます。これは、定数時間の操作です。

しかし、私たちはあなたを助けることができるようにするためにあなたが何をしようとしているのかについてもっと知る必要があります。

2つの実装のどちらが速いかを知りたいだけの場合、Pythonのtimeitモジュールにはコードの実行のタイミングを計るための関数が含まれています。例えば:

>>> from timeit import timeit
>>> l1 = [''] * 1000
>>> l2 = [''] * 1000
>>> timeit(lambda:l1 == l2)
4.670141935348511
>>> timeit(lambda:l1.count('') == len(l1))
4.50224494934082

したがって、この場合、これら2つのアプローチはほぼ同じ時間かかるように見えます(ご想像のとおり)。ただし、リストが空の文字列でいっぱいでない場合は、==より高速になります(不一致が見つかった場合、Falseリスト要素をチェックしなくてもすぐに戻ることができるため)。

>>> l3 = ['a'] + [''] * 999
>>> timeit(lambda:l3.count('') == len(l3))
4.379799842834473
>>> timeit(lambda:l3 == l2)
0.19073486328125
于 2012-12-21T13:55:29.173 に答える