2016-12-03 1 views
3

たとえば、intおよびstrオブジェクトのように、コード全体で使用される数値変数がいくつかあるとします。だから、私はそれらを保存するためにどのタイプを使用すべきですか?ここでstrとintの間のキャストのどちらの方がPythonで速いのですか?

は例です:

class Nums: 
    a = 1 # stored as int 
    b = '2' # stored as str 

print(int(Nums.b) + 5) # 7 
print(str(Nums.a) + 'Hello') # 1Hello 

あなたが見ることができるように、ストレージ、および例の用途の2つの選択肢があります。しかし、ここにあるように使用法はあまり定義されません。たとえば、クラス変数を繰り返し処理し、それらをすべて文字列に連結し、その商品を計算します。したがって、連結する必要があるときはintとして保存してstrにキャストし、strとしてキャストしてから乗算する前にintにキャストしますか?本当にstrコールとして、

In [3]: %timeit int('56') 
The slowest run took 12.92 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000000 loops, best of 3: 360 ns per loop 

In [4]: %timeit str(56) 
The slowest run took 8.36 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000000 loops, best of 3: 353 ns per loop 

そして、私はこの結果を期待する:

いくつかの簡単な研究IPythonの%timeitが、パフォーマンスはほぼ同じであることが示されているstrintはほんの少し速くなる使用オブジェクトの__str__メソッドを呼び出す一方、文字列を数値として読み取ることはより複雑になる可能性があります。何か本当の違いはありますか?その背後にある理由は何ですか?

私はあなたのプログラムは数値を使用している場合、あなたは確かにタイプintとしてそれらを格納する必要はPython 3.5について特に

+0

である私たちは、それは本当に価値はない、いくつかのnsの話をしている期待していますディスカッションimho – sirfz

+0

@ sirfzええ、これらのnsが私のプログラムに大きな違いを生み出すようなわけではありませんが、ここでの問題はより良い保管方法です。私たちが実際にどれほどの効率を得ているかにかかわらず、より効率的な理由は何ですか。 – Leva7

答えて

1

を話しています。数値型はほとんどの場合文字列型よりも高速であり、ユースケースが文字列表現が高速であったとしても、他の利点があります。いくつか例を挙げる:

  • 無料で健全性チェックを受けます。誰かがあなたのプログラムに「5」を押し込もうとすると、整数として格納していると早くエラーが出ます。文字列として格納している場合は、エラーが原因で推測するのがずっと難しくなる可能性があります。
  • あなたのプログラムを拾う誰でも数値が数値型
  • として保存すると、再び、数値型として物事を格納すると、ほとんど常に速く
+0

それは事実です。私のプログラムは文字列操作の数値と文字列表現の両方を使用します。 「数値型のものを格納することは、ほとんど常に高速です」とはどういう意味ですか?オブジェクトへのアクセスが高速か、それとも何ですか? – Leva7

+0

はい。文字列はオブジェクトとして格納され、文字配列に到達するためには逆参照が必要です。整数にはこのオーバーヘッドはありません。 – Tim

関連する問題