2

複数の条件が真であるかどうかをテストする場合、andステートメントはall()高速ですか?例えば:

if '1234'.isdigit() and '4567'.isdigit() and '7890'.isdigit(): 
    print "All are digits!"

また

if all(['1234'.isdigit(), '4567'.isdigit(), '7890'.isdigit()]): 
    print "All are digits!"

ありがとう!

4

3 に答える 3

11

ands の方が速く、リストの作成も関数呼び出しもありません。

In [10]: %timeit '1234'.isdigit() and '4567'.isdigit() and '7890'.isdigit()
1000000 loops, best of 3: 186 ns per loop

In [11]: %timeit all(['1234'.isdigit(), '4567'.isdigit(), '7890'.isdigit()])
1000000 loops, best of 3: 323 ns per loop

 

ands は、不必要に評価することさえしません。

In [1]: def x():
   ...:     print 'call'
   ...:     return False
   ...:

In [2]: x() and x()
call
Out[2]: False

In [3]: all([x(), x()])
call
call
Out[3]: False
于 2013-02-28T21:18:50.720 に答える
5

2 つ目はすべての条件を評価し、それらのブール値をリストに入れ、それらがすべて true かどうか確認します。

一方、最初のものは、それらすべてを 1 つずつチェックし、最初の false 条件 (存在する場合) で停止します。Pavelの答えが示すように、最初のものは間違いなく高速です。

all短絡を可能にするジェネレーターを使用することもできます。

all(str.isdigit(s) for s in your_strings)
于 2013-02-28T21:20:54.217 に答える
2

3 つの静的な値を処理する最速の方法が本当に必要であり、数十ナノ秒の違いがコードで実際に問題になる場合:

if True:
    print "All are digits!"

または、さらに高速:

print "All are digits!"

andパフォーマンスが少しでも問題になる場合は、大規模および/または動的な値のセットがあり、明示的なforループを作成しない限り、 でそれを行うことはできません:

value = True
for s in strings:
    value = value and s.isdigit()
    if not value:
        break
if value:
    print "All are digits!"

andそして、がまったく役に立たないことがすぐにわかります。

for s in strings:
    if not s.isdigit():
        break
else:
    print "All are digits!"

しかし、 を使ってより速く処理したい場合は、リスト内包表記の代わりにallジェネレーター式 (またはmap/imap呼び出し) を使用できます。これは、小さくて静的なシーケンスと同じように、大きくて動的なシーケンスを使用しても、同じように高速で読みやすいです。 :

if all((x.isdigit() for x in ('1234', '4567', '7890')):
    print "All are digits!"

if all((x.isdigit() for x in strings):
    print "All are digits!"

シーケンスが非常に大きく、一部の値が false である可能性がある場合、これはlist、すべての True/False 値を構築するよりもはるかに高速です。

于 2013-02-28T21:25:01.453 に答える