看板 Python 關於我們 聯絡資訊
python新手發問 在實作時遇到一個問題 (0).__sizeof__() 回傳24bytes的大小 (1).__sizeof__() 為28bytes的大小 (1073741823).__sizeof__() 為28bytes的大小 (1073741824).__sizeof__() 為32bytes的大小 總結以上和實作 整數0 大小為24bytes 整數1~1073741823及-1~-1073741823為28bytes 整數1073741824~? 為32bytes ....以此類推 我想要問的是 1073741824大小為什麼是32bytes 而1073741823大小為什麼是28bytes 這個數字是如何推導出來的? 或者說背後的儲存原理是什麼? (這個數字我是用for+if去抓出來的) 還有 為什麼整數0大小卻是24bytes 而1之後卻是28bytes了 爬stackoverflow沒有相關的問題 google也沒有講解 甚至連python官方文件也沒提到 所以上來發問 感激不盡 ----- Sent from JPTT on my Asus ASUS_Z00UD. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 110.28.72.40 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1498797116.A.3F8.html
Yshuan: 我猜是python直譯器 根據平台不同就會有不同的size實作 06/30 14:37
mikapauli: python整數類似tuple,每多30位tuple長度多1 06/30 15:32
mikapauli: 0類似空的tuple,正好空的tuple也是24bytes 06/30 15:33
mikapauli: 只是tuple長度多1是多8bytes(因為64-bit?) 06/30 15:35
為何是30位長度多1 就是這個搞不清
HenryLiKing: 感覺你問的問題都蠻深入的耶!!!! 06/30 16:35
※ 編輯: LessonWang (110.28.72.40), 06/30/2017 17:35:38
freeunixer: 就只是因為不唸書,伸手牌而已,跟深入有什麼關係? 06/30 18:39
freeunixer: 去翻 spec 一定有講.至少人家明明白白清清楚楚有交待, 06/30 18:40
freeunixer: 24 bytes 是指那個 int var 是 0 .不是 0 就會往上加. 06/30 18:41
freeunixer: 因為 3.x 會自動轉型,所以數值超過原限制就會自動放大 06/30 18:44
freeunixer: 3.x 版甚至也沒有所謂明顯的數型分別,依據實際值大小, 06/30 18:52
freeunixer: 可以一直放大,放大到吃爆你記憶體為止. 06/30 18:53
freeunixer: 每一件東西都只是看點皮毛,然後就開始瞎折騰,要答案, 06/30 18:55
freeunixer: 這樣是不行的. 06/30 18:55
freeunixer: 如果是學來找問題,不是一般使用,直接 trace code 得了 06/30 19:01
實際應用的問題才是問題 這種刁鑽難解而且有關語言本身底層運作的問題 真的毫無意義 只顯得新手想一步登天而已 我會好好考慮之後問問題的模式 謝謝f大
LessonWang: ude/longintrepr.h#L70 06/30 19:13
mikapauli: 看了你給的連結,那就應該是因為要和2bytes的版本吻合 06/30 19:25
mikapauli: 用我的理解幫你整理一下吧。為了方便轉換到帶號整數, 06/30 19:48
mikapauli: 16-bit版的大數實作只用了15bits,以此寫的pow_mod表有 06/30 19:51
mikapauli: 32格(2**5)。以此沿用到32-bit版使其只用了30bits。 06/30 19:53
mikapauli: 也不可能做長2**31的指數表,用30也合理。 06/30 19:54
原來如此 感謝m大!! ※ 編輯: LessonWang (110.28.72.40), 06/30/2017 19:57:17 ※ 編輯: LessonWang (110.28.72.40), 06/30/2017 19:58:23
darkgerm: 我覺得這個問題還不錯,幫推一個 06/30 23:59
HenryLiKing: 你是不是在做這方面的專題呀? 07/01 00:30
沒有哦
Sunal: 推trace code從頭來 這麼關注底層乾脆學C++好了 07/01 00:45
有考慮過xd ※ 編輯: LessonWang (110.28.72.40), 07/01/2017 08:20:53 ※ 編輯: LessonWang (110.28.72.40), 07/01/2017 09:14:14