Tag: python internals

元组是否比Python中的列表更有效?

元组和列表在元素的实例化和检索时是否有任何性能差异?

为什么CPython中的id({})== id({})和id()== id()?

为什么CPython(不知道其他Python实现)具有以下行为? tuple1 = () tuple2 = () dict1 = {} dict2 = {} list1 = [] list2 = [] # makes sense, tuples are immutable assert(id(tuple1) == id(tuple2)) # also makes sense dicts are mutable assert(id(dict1) != id(dict2)) # lists are mutable too assert(id(list1) != id(list2)) assert(id(()) == id(())) # why no assertion error on […]

关于Python的内置sort()方法

Python中使用sort()方法构build的algorithm是什么? 是否有可能看看该方法的代码?

为什么在Python 3中“1000000000000000(1000000000000001)”这么快?

我的理解是, range()函数实际上是Python 3中的一个对象types ,它在运行中生成其内容,类似于生成器。 在这种情况下,我预料到下面这一行需要花费过多的时间,因为为了确定是否在这个范围内,需要生成四十亿个值: 1000000000000000 in range(1000000000000001) 此外:似乎不pipe我添加了多less零,计算或多或less需要相同的时间量(基本上是瞬时的)。 我也尝试过这样的事情,但计算仍然几乎是即时的: 1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens 如果我试图实现我自己的范围function,结果是不是很好! def my_crappy_range(N): i = 0 while i < N: yield i i += 1 return range()对象在引擎盖下做什么使它如此之快? 编辑:这已经certificate是一个比我预期的更细致的话题 – 似乎有一段历史背后的优化range() 。 Martijn Pieters的答案是为了它的完整性而被选中的,但是也可以看一下abarnert的第一个答案 ,那就是在Python 3中对range是一个完整序列意味着什么,以及关于__contains__函数优化的潜在不一致性的一些信息/警告Python实现。 abarnert的其他答案更详细一些,并为那些对Python 3优化背后的历史感兴趣的人提供链接(并且缺乏Python 2中的xrange优化)。 由poke和wim提供的答案为有兴趣的人提供了相关的C源代码和解释。

如何交换python元组(a,b)=(b,a)中的成员在内部工作?

In [55]: a = 5 In [56]: b = 6 In [57]: (a, b) = (b, a) In [58]: a Out[58]: 6 In [59]: b Out[59]: 5 如何交换a和b的值在内部工作? 它绝对不使用临时variables。

Python的列表是如何实现的?

它是一个链表,一个数组? 我四处搜寻,只发现有人猜测。 我的C知识不足以查看源代码。

什么时候del在python中有用?

我真的不知道为什么python需要del关键字(大多数语言似乎没有类似的关键字)。 例如,不是删除一个variables,而是可以将None赋值给它。 从字典中删除时,可以添加一个del方法。 有没有任何理由保持python的del ,或者它是Python的预垃圾回收日的遗迹?

Python中的Integercaching是什么?

深入Python的源代码之后,我发现它维护了一个从int(-5)到int(256)(@ src / Objects / intobject.c)的PyInt_Object数组, 一个小实validation明了这一点: >>> a = 1 >>> b = 1 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False 但是如果我把这些代码一起运行在一个py文件中(或者用分号join),结果是不一样的: >>> a = 257; b = 257; a is b True 我很好奇为什么他们仍然是同一个对象,所以我深入挖掘语法树和编译器,我想出了一个调用层次结构如下: PyRun_FileExFlags() mod = PyParser_ASTFromFile() node *n = PyParser_ParseFileFlagsEx() //source […]

关于不可变string的变化的ID

关于strtypes的对象的id (在Python 2.7中)困惑我。 strtypes是不可变的,所以我期望一旦它被创build,它将始终具有相同的id 。 我相信我不会自言自语,所以我会发表一个input和输出序列的例子。 >>> id('so') 140614155123888 >>> id('so') 140614155123848 >>> id('so') 140614155123808 与此同时,它一直在变化。 但是,在指向该string的variables之后,情况会发生变化: >>> so = 'so' >>> id('so') 140614155123728 >>> so = 'so' >>> id(so) 140614155123728 >>> not_so = 'so' >>> id(not_so) 140614155123728 所以它看起来像冻结了id,一旦一个variables持有这个值。 的确,在del so和del not_so , id('so')的输出开始再次改变。 这与(小)整数不一样。 我知道在不变性和同一个id之间没有真正的联系; 但是,我正在试图找出这种行为的来源。 我相信熟悉python内部构件的人不会比我感到惊讶,所以我试图达到同样的观点。 更新 试着用不同的string给出不同的结果… >>> id('hello') 139978087896384 >>> id('hello') […]

字典是用Python 3.6+订购的

字典在Python 3.6中(至less在CPython实现下)与以前的版本不同。 这似乎是一个实质性的变化,但这只是文档中的一小段。 它被描述为CPython的实现细节而不是语言特征,但也意味着这可能在未来成为标准。 新的字典实现如何在保持元素顺序的同时比旧的更好? 以下是文档中的文字: dict()现在使用由PyPy开创的“紧凑”表示。 新的dict()的内存使用比Python 3.5要小20%到25%。 PEP 468 (保留函数中的** kwargs的顺序)由此实现。 这个新实现的顺序保留方面被认为是一个实现细节,不应该被依赖(这可能会在将来发生变化,但是希望在改变语言规范之前在几个版本中使用这个新的dict实现语言为所有当前和未来的Python实现指定保留顺序的语义;这也有助于保持随机迭代顺序仍然有效的老版本语言的向后兼容性,例如Python 3.5)。 (由INADA Naoki提供, 刊登在27350号文件中, 最初由Raymond Hettinger提出 。 编辑:Raymond Hettinger 最近在推特上说 :“[有了dict命令]非常方便,对[Python] 3.7的保证几乎是不可避免的”。 编辑2:如何CPython 3.6 dict的两个例子并不总是显示在插入顺序, 与pprint和IPython的pprint 。