问题标签 [python-internals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 来自 sys.getrefcount 的意外值
Python 2.7.5 下
三个引用计数在哪里?
PS:什么时候 10000 PyIntObject 将 Py_DECREF 为 0 ref 并被释放?不要说 gc 的东西,引用计数本身可以在没有 gc 的情况下工作。
python - 在排序时访问列表
我可以在列表中对列表进行排序时访问它吗list.sort()
这返回
请注意,列表的各个项目b
被发送到 function m
。但是在m
listb
是空的,但是它可以看到与f
list 具有相同范围的变量b
。为什么函数m
打印b
为[]
?
python - 为什么一个类变量没有在列表理解中定义,而另一个是?
我刚刚阅读了这个问题的答案:Accessing class variables from a list comprehension in the class definition
它有助于我理解为什么以下代码会导致NameError: name 'x' is not defined
:
发生这种NameError
情况是因为x
未在列表理解的特殊范围内定义。但我无法理解为什么下面的代码可以正常工作而没有任何错误。
我得到了输出[0, 1, 2, 3]
。但我期待这个错误:NameError: name 'data' is not defined
因为我期待就像在前面的示例中一样,名称x
没有在列表推导的范围内定义,同样,名称data
也不会在列表推导的范围内定义。
你能帮我理解为什么x
没有在列表理解的范围内定义而是定义data
吗?
python - 在python中安全使用remove方法
我从列表中继承了一个 UserList 类并实现了以下方法来删除标记为已删除的条目
元素本身是一个复杂的实体,具有覆盖比较运算符的方法
问题
- 上述代码能否成功移除对象?
- python 如何在内部工作以从列表中删除元素?
- 当我们同时迭代和修改同一个列表时会不会产生问题?
python - 为什么 python 中的函数/方法调用很昂贵?
在这篇文章中,Guido van Rossum 说函数调用可能很昂贵,但我不明白为什么,也不知道会贵多少。
一个简单的函数调用给你的代码增加了多少延迟,为什么?
python - 为什么`float`函数比乘以1.0慢?
我知道这可以说是一个非问题,但我为 HPC 环境编写软件,所以这 3.5 倍的速度提升实际上有所作为。
我曾经dis
看过代码,我认为float()
它会更慢,因为它需要一个函数调用(不幸的是我dis.dis(float)
看不到它实际上在做什么)。
我想第二个问题是我应该什么时候使用float(n)
,什么时候应该使用n * 1.0
?
python - 为什么 int 在 Python 中需要三倍的内存?
在 64 位系统上,Python 中的整数占用 24 个字节。这是 64 位整数在例如 C 中所需内存的 3 倍。现在,我知道这是因为 Python 整数是对象。但是额外的内存有什么用呢?我有我的猜测,但很高兴知道。
python - 为什么编译为字节码时整数除法没有优化?
首先,让我展示一个我做的实验:
正如您在 , 的输出中看到的dis.dis
,1.5 * 2
并被4 - 2
编译为LOAD_CONST
而不是两个,LOAD_CONST
然后是二进制操作。
但4 / 2
不会被替换为LOAD_CONST 4 (2)
.
我想知道为什么优化中忽略了除法。
我使用的 Python 版本是 2.7.5。
顺便说一句,似乎在 Python 3 中,像这样的函数得到了更好的优化,这就是我所看到的:
python - 为什么可以在 Python 函数中使用超过 2 ^ 16 个常量?
在像peephole这样的内部模块中,参数 ofLOAD_CONST
存储在opcode
.
例如,它用于获取操作参数的宏实现为:
#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
的参数是数组LOAD_CONST
的索引。consts
所以我猜也许我们在 Python 函数中最多只能使用 2 ^ 16 个常量。
但是当我尝试使用 66666 (> 65536) 常量的函数时,它仍然可以正常运行。
可能是什么原因?
python - CPython 垃圾何时收集?
如果我的理解是正确的,在 CPython 中,对象的引用计数一达到零就会被删除。如果您有无法访问的引用循环,则该逻辑将不起作用,但有时解释器会尝试找到它们并删除它们(您可以通过调用 gc.collect() 手动执行此操作)。
我的问题是,这些解释器触发的循环收集步骤何时发生?什么样的事件会触发它们?
我对 CPython 案例更感兴趣,但很想听听这在 PyPy 或其他 python 实现中有何不同。