python - 为什么 False 值 (0) 的字节数小于 True (1)?

标签 python types size cpython

我在玩sysgetsizeof(),发现False(或0)由少于 True(或 1)的字节组成。这是为什么呢?

import sys

print("Zero: " + str(sys.getsizeof(0)))
print("One: " + str(sys.getsizeof(1)))
print("False: " + str(sys.getsizeof(False)))
print("True: " + str(sys.getsizeof(True)))

# Prints:
# Zero: 24
# One: 28
# False: 24
# True: 28

事实上,其他数字(也有一些由多于一位的数字组成)是 28 个字节。

for n in range(0, 12):
  print(str(n) + ": " + str(sys.getsizeof(n)))

# Prints:
# 0: 24
# 1: 28
# 2: 28
# 3: 28
# 4: 28
# 5: 28
# 6: 28
# 7: 28
# 8: 28
# 9: 28
# 10: 28
# 11: 28

更多:sys.getsizeof(999999999) 也是 28 字节!但是,sys.getsizeof(9999999999) 是 32。

那么发生了什么?我假设 bool 值 TrueFalse 分别在内部转换为 01 ,但为什么是零不同其他较低整数的大小?

附带问题:这是特定于 Python (3) 如何表示这些项目的,还是这通常是操作系统中数字的表示方式?

最佳答案

记住 Python int值是任意大小的。它是如何工作的?

好吧,在 CPython 中,1 一个 int 由 PyLong_Object 表示,它有一个由 4 字节 block 组成的数组2,每个 block 包含 30 位3 的数字。

  • 0完全不占用任何 block 。
  • 1 - (1<<30)-1占用 1 个 block 。
  • 1<<30 - (1<<60)-1需要 2 个 block 。

等等。

这有点过于简单了;详情请见 longintrepr.h 在源代码中。


在 Python 2 中,有两种不同的类型,称为 intlong .一个 int由直接嵌入在 header 中的 C 32 位有符号整数4 表示,而不是 block 数组。一个 long就像 Python 3 int .

如果你用 0L 做同样的测试, 1L等,明确要求 long值,您将获得与 Python 3 中相同的结果。但没有 L后缀,任何适合 32 位的文字都会给你一个 int , 只有太大的字面量才会给你 long s.5 (这意味着 (1<<31)-1int ,但 1<<31 是 2 block long 。)


<子>1。在不同的实现中,这可能不是真的。 IIRC,Jython 做的事情与 CPython 大致相同,但 IronPython 使用 C#“bignum”实现。

<子>2。为什么是 30 位而不是 32 位?主要是因为pow的执行和 **如果可以假设两个“数字”中的位数可以被 10 整除,则可以更简单、更快。 .

<子>3。它使用 C "struct hack" .从技术上讲,Py_LongObject是 28 个字节,但没有人分配过 Py_LongObject ;他们 malloc 24、28、32、36 等字节然后转换为 Py_LongObject * .

4.事实上,一个 Python int是一个 C long ,只是为了让事情变得困惑。所以 C API 充满了 PyInt_FromLong 之类的东西。 long表示“32 位整数”和 PyLong_FromSize_t long意思是“大数字”。

5. Python 2.x 的早期版本没有集成 intlong也很好,但希望没有人再担心这些了。<​​/sub>

关于python - 为什么 False 值 (0) 的字节数小于 True (1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49926843/

相关文章:

python - 合并 pandas groupBy 对象

javascript - 使用精美的 Html 模板

python:列表操作

python /MyPy : How to annotate a method that can return one of several different types of objects?

c++ - 将 float 转换为 float/int 后返回不同的结果

jquery - 响应式全屏 CarouFredSel 幻灯片

c# - 调整 Window Forms 应用程序大小时如何保持纵横比?

python - 使用对象递归打印家谱

c++ - cpp 函数来检索各种数据类型的值

c - 有效地使用具有不同大小的内部数组的 C 结构?