は、私はしばらく前に尋ねた:なぜ浮動小数点数のPython 3レンジオブジェクトの最適化はありませんか?前の質問から飛び降り
Why is 1000000000000000 in range(1000000000000001) so fast in Python 3?
あなたはこれを行う場合:
1000000000000000.0 in range(1000000000000001)
... range
がいるかどうかを確認するために最適化されていないことは明らかですfloat
が指定された範囲内にあります。
私はrange
の目的でのみint
秒で動作するようであることを理解だと思う - ので、あなたは、例えば、このような何かすることはできません。
1000000000000 in range(1000000000000001.0)
# error: float object cannot be interpreted as an integer
またはこの:
1000000000000 in range(0, 1000000000000001, 1.0)
# error: float object cannot be interpreted as an integer
を
しかし、何らかの理由で、このようなことを許可するように決定されました:
1.0 in range(1)
の最適化が同様に機能するため、1.0
(および上記の1000000000000.0
)は、int
に強制されていないようです。
私の質問は、なぜ矛盾、なぜfloat
の最適化がないのですか?あるいは、上記のコードが前の例と同じエラーを生成しない理由の背後にある根拠は何ですか?
これは、int
の最適化に加えて明らかな最適化のようです。私は、そのような最適化のクリーンな実装を妨げるいくつかの微妙な問題があると推測しています。あるいは、そのような最適化を実際には含まない理由について何らかの根拠があります。あるいは、おそらく両方。
編集:ここで少し問題を明確にするために、すべて次の文は、同様False
に評価さ:
3.2 in range(5)
'' in range(1)
[] in range(1)
None in range(1)
これは私には予期しない動作のように思えるが、今のところ何の矛盾は間違いありません。ただし、以下はTrue
に評価されます。
1.0 in range(2.0)
を、以前に示したように、上記と同様の構造が最適化されていません。
これは、評価のある時点で値1.0
(または私の元の例では1000000000001.0
)が強制的にint
になっているようです。これは、.0
で終わるfloat
をint
に変換するのは当然のことなので意味があります。しかし、まだ問題は残っています。とにかくint
に変換されている場合、1000000000000.0 in range(1000000000001)
はなぜ最適化されていませんか?
あなたの編集では、 'x in range(n)'が* any * float 'x'に対してfalseであると仮定しているようです。それは真実ではありません:たとえば、 '1.0 in range(2)'を試してください。 –
@ MarkDickinson良い点 - 今私は私が矛盾していると考えているところに戻り、1000000000000.0の範囲(1000000000001)が最適化されていないということについては疑問が残っています。残念ながら私はすでに答えを受け入れています。 –
@ MarkDickinson質問を再編集しました。これを指摘してくれてありがとう。 –