Python の組み込み関数intは、値が既に整数であっても、送信された値を変換しようとしますか?
より簡潔に:変換アルゴリズムによってと の間int('42')
にパフォーマンスの違いはありますか?int(42)
Python の組み込み関数intは、値が既に整数であっても、送信された値を変換しようとしますか?
より簡潔に:変換アルゴリズムによってと の間int('42')
にパフォーマンスの違いはありますか?int(42)
thefourtheye で詳しく説明されているように、これは の関数long_long
で処理されます。Objects/longobject.c
static PyObject *
long_long(PyObject *v)
{
if (PyLong_CheckExact(v))
Py_INCREF(v);
else
v = _PyLong_Copy((PyLongObject *)v);
return v;
}
そのため、引数がすでに であるint
場合、参照カウントがインクリメントされ、同じオブジェクトが返されます。
一般に、不変型に対して同様の動作を想定できます。たとえば、tuple(mytuple)
は への新しい参照を返しますが、mytuple
対照的にlist(mylist)
は のコピーを作成しますmylist
。
int
オブジェクトをに渡すとint()
、同じオブジェクトが返されます (CPython 3.3.2):
>>> a = 1000 * 1000 # large enough to avoid interning
>>> b = int(a)
>>> a is b
True
「アルゴリズムのパフォーマンスの違い」とはどういう意味かわかりませんが、新しいオブジェクトを作成するわけではありません。
両方を比較してみませんか?
>>> def f(): int('42')
...
>>> def g(): int(42)
...
>>> from timeit import timeit
>>> timeit(f)
0.3384080480027478
>>> timeit(g)
0.2566616949989111