7

Python の組み込み関数intは、値が既に整数であっても、送信された値を変換しようとしますか?

より簡潔に:変換アルゴリズムによってと の間int('42')にパフォーマンスの違いはありますか?int(42)

4

4 に答える 4

11

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

于 2014-02-23T09:55:11.550 に答える
7

intオブジェクトをに渡すとint()、同じオブジェクトが返されます (CPython 3.3.2):

>>> a = 1000 * 1000 # large enough to avoid interning
>>> b = int(a)
>>> a is b
True

「アルゴリズムのパフォーマンスの違い」とはどういう意味かわかりませんが、新しいオブジェクトを作成するわけではありません。

于 2014-02-23T09:52:48.177 に答える
1

両方を比較してみませんか?

>>> def f(): int('42')
... 
>>> def g(): int(42)
... 
>>> from timeit import timeit
>>> timeit(f)
0.3384080480027478
>>> timeit(g)
0.2566616949989111
于 2014-02-23T09:33:12.293 に答える