質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

853閲覧

getsizeofメソッドが返すのは「bit」か「byte」か

Plasma

総合スコア17

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/10/25 11:47

編集2022/10/25 16:25

質問

Pythonでは、int型は使える桁数が無制限だと聞きました。
しかし、メモリによってその上限が変わるため
自分の使っているiPad Proではどこまでできるかを調べようと思いました。
以下が実際にギリギリアプリがクラッシュせずに出力できた結果です。

Python

1 2import sys 3 4n = 35957779898 5 6print(sys.getsizeof(1<<n) 7 8# > 4794370680

ドキュメントには「getsizeofはobjectのサイズをバイトで返す」
と書かれていたので、およそ4.79GB消費したら限界を迎えるという結果が分かりました。

Pythonではint型オブジェクトが生成された時に
デフォルトで28bitのメモリを消費するらしいので調べてみたところ

Python

1import sys 2 3print(sys.getsizeof(1)) 4 5# > 28

👆このような結果になりました。
これは「28bit」ではなく「28byte」なのでしょうか?

同じ方法でメモリサイズを調べているサイト記事では
「28bit」と書かれていました。

自分的には「28bit」だと納得できます。
「1」が「28byte」ものメモリサイズがあるとは思えません。

なぜバイトで返すと書かれているのに
「3.5(byte)」などではなく「28」と出力されるのでしょうか?

追記

Python

1 2import sys 3 4print(sys.getsizeof(1<<32))

この実行結果が「32」になるため
「32bitか」→「28は28bitか」と勘違いしたのかもしれません。

1<<32は33桁の2進数になるため、メモリサイズが4byte分拡張されて
24byte + 4byte + 4byte = 32byte
になるのなら辻褄が合いますね。

あとは24bytePyVarObjectが理解できればいいのですが
これはどういうものだと解釈すれば良いでしょうか?
オブジェクトを生成する際に、全ての型の元になっている型を
宣言せずに自動的に呼び出しているということでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/10/25 14:34 編集

「Pythonではint型オブジェクトが生成された時にデフォルトで28bitのメモリを消費するらしい」というのはどこからの情報でしょうか。 と、書きましたが、ちょっと検索したら出てきました。 そのサイトでbitとしているのは単なる間違えだと思います。
guest

回答2

0

Python における、(最小単位の) int 型オブジェクトの定義は以下になります。

cpython/longintrepr.h at main · python/cpython

c

1struct _longobject { 2 PyObject_VAR_HEAD 3 digit ob_digit[1]; 4};

cpython/object.h

c

1#define PyObject_VAR_HEAD PyVarObject ob_base;

ここで、_longobject 構造体のサイズを調べてみます。

bash

1$ gdb python3-dbg # python command with debug symbols 2 : 3 4(gdb) p sizeof(PyVarObject) 5$1 = 24 6(gdb) p sizeof(digit) 7$2 = 4

というわけで、Python における int 型インスタンスの(最小の)占有メモリサイズは 24 + 4 = 28 bytes ということになります。

投稿2022/10/25 12:38

編集2022/10/25 12:54
melian

総合スコア19865

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/10/26 01:51

pythonnoオブジェクトの内部表現についてはいかのドキュメントに説明があります。 https://docs.python.org/ja/3/c-api/structures.html > あとは24byteのPyVarObjectが理解できればいいのですがこれはどういうものだと解釈すれば良いでしょうか?オブジェクトを生成する際に、全ての型の元になっている型を宣言せずに自動的に呼び出しているということでしょうか? そういうことではなく、pythonを実装するにあたって、オブジェクトのメモリ上での表現の定義がそうなっているということです。
bsdfan

2022/10/26 02:12

Cの構造体での実装に興味があれば、こちらが参考になるかと。 https://qiita.com/yo314159265/items/0f7050549f1f74423fc7 参照カウントで8バイト、TypeObjectへのポインタで8バイト、可変部分のカウントで8バイトの24バイトっぽいです。 0 は可変部分が不要なのか、24バイトしか使わない模様。
guest

0

https://docs.python.org/ja/3/library/sys.html#sys.getsizeof

バイト数、と書かれていますね

投稿2022/10/25 12:40

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問