Questions tagged «python-internals»

Python如何在引擎盖下工作?用于与(例如)设计决策以及内部数据结构和使用的算法有关的问题。

10
为什么在Python 3中“范围(1000000000000000(1000000000000001))”这么快?
据我了解,该range()函数实际上是Python 3中的一种对象类型,它会像生成器一样动态生成其内容。 在这种情况下,我本以为下一行会花费过多的时间,因为要确定1个四舍五入是否在该范围内,必须生成一个四舍五入值: 1000000000000000 in range(1000000000000001) 此外:似乎无论我添加多少个零,计算多少都花费相同的时间(基本上是瞬时的)。 我也尝试过这样的事情,但是计算仍然是即时的: 1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens 如果我尝试实现自己的范围函数,结果将不是很好! def my_crappy_range(N): i = 0 while i < N: yield i i += 1 return 使range()物体如此之快的物体在做什么? 选择Martijn Pieters的答案是因为它的完整性,但也看到了abarnert的第一个答案,它很好地讨论了在Python 3中range成为完整序列的含义,以及一些有关__contains__跨Python实现的函数优化潜在不一致的信息/警告。。abarnert的其他答案更加详细,并为那些对Python 3优化背后的历史(以及xrangePython 2中缺乏优化)感兴趣的人提供了链接。poke和wim的答案为感兴趣的人提供了相关的C源代码和说明。

14
@property装饰器如何工作?
我想了解内置函数的property工作原理。令我感到困惑的是,property它还可以用作装饰器,但是仅当用作内置函数时才接受参数,而不能用作装饰器。 这个例子来自文档: class C(object): def __init__(self): self._x = None def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, "I'm the 'x' property.") property的论点是getx,setx,delx和文档字符串。 在下面的代码中property用作装饰器。它的对象是x函数,但是在上面的代码中,参数中没有对象函数的位置。 class C(object): def __init__(self): self._x = None @property def x(self): """I'm the 'x' property.""" return self._x …


11
“ is”运算符对整数的行为异常
Наэтотвопросестьответына 堆栈溢出нарусском:Присваиваниецелых(INT)вПитоне 为什么以下内容在Python中表现异常? >>> a = 256 >>> b = 256 >>> a is b True # This is an expected result >>> a = 257 >>> b = 257 >>> a is b False # What happened here? Why is this False? >>> 257 is 257 True # Yet …

4
是否在Python 3.6+中订购了字典?
与以前的版本不同,字典在Python 3.6中排序(至少在CPython实现下)。这似乎是一个重大更改,但只是文档中的一小段。它被描述为CPython实现细节而不是语言功能,但这也意味着将来可能会成为标准。 在保留元素顺序的同时,新的字典实现如何比旧的实现更好? 以下是文档中的文字: dict()现在使用PyPy率先提出的“紧凑”表示形式。与Python 3.5相比,新dict()的内存使用量减少了20%至25%。PEP 468(在函数中保留** kwarg的顺序。)由此实现。此新实现的顺序保留方面被认为是实现细节,因此不应依赖(将来可能会更改,但是希望在更改语言规范之前,先在几个发行版中使用该新dict实现该语言,为所有当前和将来的Python实现强制要求保留顺序的语义;这还有助于保留与仍旧有效的随机迭代顺序的旧版本语言(例如Python 3.5)的向后兼容性。(由INADA Naoki在发行27350。最初由Raymond Hettinger提出的想法。) 2017年12月更新:Python 3.7 保证dict保留插入顺序

20
什么时候del在python中有用?
我真的想不出python为什么需要del关键字的任何原因(大多数语言似乎没有类似的关键字)。例如,可以删除变量而不是删除变量None。从字典中删除时,del可以添加一个方法。 是否有任何理由保留del在python中,或者它是Python的垃圾收集日的痕迹?


2
为什么有些float <整数比较的速度慢四倍?
将浮点数与整数进行比较时,某些值对的评估时间要比其他类似幅度的值花费更长的时间。 例如: &gt;&gt;&gt; import timeit &gt;&gt;&gt; timeit.timeit("562949953420000.7 &lt; 562949953421000") # run 1 million times 0.5387085462592742 但是,如果将float或整数变小或变大一定数量,则比较会更快地运行: &gt;&gt;&gt; timeit.timeit("562949953420000.7 &lt; 562949953422000") # integer increased by 1000 0.1481498428446173 &gt;&gt;&gt; timeit.timeit("562949953423001.8 &lt; 562949953421000") # float increased by 3001.1 0.1459577925548956 更改比较运算符(例如使用==或&gt;代替)不会以任何明显的方式影响时间。 这不只是涉及到大小,因为采摘较大或较小的值会导致比较快,所以我怀疑它已经降到了一些不幸的方式位排队。 显然,对于大多数用例而言,比较这些值已足够快。我只是对为什么Python似乎在某些价值观上比在其他价值观上挣扎更多感到好奇。

2
为什么('x',)中的'x'比'x'=='x'快?
&gt;&gt;&gt; timeit.timeit("'x' in ('x',)") 0.04869917374131205 &gt;&gt;&gt; timeit.timeit("'x' == 'x'") 0.06144205736110564 也适用于具有多个元素的元组,两个版本似乎线性增长: &gt;&gt;&gt; timeit.timeit("'x' in ('x', 'y')") 0.04866674801541748 &gt;&gt;&gt; timeit.timeit("'x' == 'x' or 'x' == 'y'") 0.06565782838087131 &gt;&gt;&gt; timeit.timeit("'x' in ('y', 'x')") 0.08975995576448526 &gt;&gt;&gt; timeit.timeit("'x' == 'y' or 'x' == 'y'") 0.12992391047427532 基于此,我认为我应该完全开始in在任何地方而不是在所有地方使用==!




5
从类定义中的列表理解访问类变量
如何从类定义中的列表理解中访问其他类变量?以下内容在Python 2中有效,但在Python 3中失败: class Foo: x = 5 y = [x for i in range(1)] Python 3.2给出了错误: NameError: global name 'x' is not defined 尝试Foo.x也不起作用。关于如何在Python 3中执行此操作的任何想法? 一个更复杂的激励示例: from collections import namedtuple class StateDatabase: State = namedtuple('State', ['name', 'capital']) db = [State(*args) for args in [ ['Alabama', 'Montgomery'], ['Alaska', 'Juneau'], # …

3
为什么x ** 4.0比Python 3中的x ** 4快?
为什么x**4.0要比x**4?我正在使用CPython 3.5.2。 $ python -m timeit "for x in range(100):" " x**4.0" 10000 loops, best of 3: 24.2 usec per loop $ python -m timeit "for x in range(100):" " x**4" 10000 loops, best of 3: 30.6 usec per loop 我尝试更改所提高的力量以查看其作用方式,例如,如果我将x提高至10或16的力量,它会从30跳到35,但是如果我以浮点数提高10.0,那只是在移动大约24.1〜4。 我想这可能与浮点转换和2的幂有关,但我真的不知道。 我注意到在这两种情况下2的幂都更快,因为这些计算对于解释器/计算机而言更本机/更容易,所以我想。但尽管如此,浮子几乎没有动。2.0 =&gt; 24.1~4 &amp; 128.0 =&gt; 24.1~4 但 …

3
为什么两个相同的列表具有不同的内存占用量?
我创建了两个列表l1和l2,但是每个列表都有不同的创建方法: import sys l1 = [None] * 10 l2 = [None for _ in range(10)] print('Size of l1 =', sys.getsizeof(l1)) print('Size of l2 =', sys.getsizeof(l2)) 但是输出使我感到惊讶: Size of l1 = 144 Size of l2 = 192 使用列表推导创建的列表在内存中的容量更大,但是在Python中,这两个列表是相同的。 这是为什么?这是CPython内部的东西,还是其他解释?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.