python-internals相关内容
我一直希望从我的代码中获得更多的性能;最近,在浏览this Python wiki page时,我发现了这样的说法: 多重分配比单独分配慢。例如,x,y=a,b";比";x=a;y=b";慢。 好奇,我(在Python2.7上)测试了它: $ python -m timeit "x, y = 1.2, -1.4" 10000000 loops, best
..
..
是链表还是数组?我四处寻找,只发现人们在猜测.我的 C 知识还不够好,无法查看源代码. 解决方案 这是一个动态数组.实际证明:无论索引如何,索引都需要(当然差异非常小(0.0013 µsecs!))相同的时间: ...>python -m timeit --setup="x = [None]*1000" "x[500]"10000000 次循环,3 次中的最佳:每个循环 0.0579 微
..
..
..
据我了解 range() 函数,其实就是 Python 3 中的一种对象类型,动态生成其内容,类似于生成器. 在这种情况下,我预计以下行会花费过多的时间,因为为了确定 1 万亿是否在范围内,必须生成 1 万亿值: 1_000_000_000_000_000 在范围内(1_000_000_000_000_001) 此外:似乎无论我添加多少个零,计算或多或少都需要相同的时间(基本上是瞬时的)
..
我想让我的代码更有效率(内存).现在我们有很多以可迭代作为参数的函数,例如: def foo(para,meter,iterable):#...经过 有时我们必须为它提供一个空列表才能正常工作:foo(14,25,[]).问题是每次构造一个新列表时:它需要在堆上分配,并且一个列表似乎是 64 字节的内存(在我自己的机器上,用 sys.getsizeof([])) 而只有空元组占用(可能一次)4
..
据我所知,使用 []、{} 或 () 实例化对象会返回 list、dict 或 tuple 分别;具有新身份的新实例对象. 这对我来说很清楚,直到我实际测试它并且我注意到 () is () 实际上返回 True 而不是预期的 False: >>>() 是 (),[] 是 [],{} 是 {}(真,假,假) 正如预期的那样,当使用 list(), dict() 和 tuple() 分别为:
..
tuple 在 Python 中占用更少的内存空间: >>>a = (1,2,3)>>>a.__sizeof__()48 而 lists 占用更多内存空间: >>>b = [1,2,3]>>>b.__sizeof__()64 Python 内存管理内部发生了什么? 解决方案 我假设您使用的是 64 位的 CPython(我在 CPython 2.7 64 位上得到了相同的结果).其
..
我一直在尝试了解 CPython 是如何在幕后实现的.Python 是高级别的很好,但我不喜欢把它当作一个黑盒子. 考虑到这一点,如何实现元组?我看过 源代码 (tupleobject.c),但它超出了我的头脑. 我看到 PyTuple_MAXSAVESIZE = 20 和 PyTuple_MAXFREELIST = 2000,什么是保存和“空闲列表"?(长度为 20/21 或 200
..
在 [55] 中:a = 5在 [56] 中:b = 6在[57]中:(a,b)=(b,a)在[58]中:出局[58]:6在[59]中:b出局[59]:5 这种 a 和 b 值的交换如何在内部进行?它绝对没有使用临时变量. 解决方案 Python 将右侧表达式与左侧赋值分开.首先评估右侧,并将结果存储在堆栈中,然后使用再次从堆栈获取值的操作码分配左侧名称. 对于 2 或 3 项的元
..
当我尝试在迭代其元素时更新集合时,它的行为应该是什么? 我在各种场景中尝试过它,它不会对迭代开始后添加的元素进行迭代,也不会对迭代期间删除的元素进行迭代.如果我在迭代期间删除并放回任何元素,则正在考虑该元素.确切的行为是什么以及它是如何工作的? 这会打印字符串的所有排列: def 排列:答案 = []def 助手(创建,剩余):如果 len(created) == len(s):an
..
鉴于零比雷埃夫斯对另一个问题的回答,我们知道了 x = tuple(set([1, "a", "b", "c", "z", "f"]))y = tuple(set(["a", "b", "c", "z", "f", 1]))打印(x == y) 使用 哈希随机化已启用.为什么是 85%? 解决方案 我假设这个问题的任何读者都读过: 零比雷埃夫斯的回答和 我对 CPython
..
采用可散列对象的容器(例如 dict 键或 set 项).因此,字典只能有一个值为 1、1.0 或 True 等的键.(注意:有些简化 - 哈希冲突是允许,但这些值被认为是相等的) 我的问题是:解析顺序是否明确定义,生成的对象是否可跨实现预测?例如,OSX Python 2.7.11 和 3.5.1 对 dict 的解释如下: >>>{真:'a',1:'b',1.0:'c',(1+0j):
..
我目前正在尝试了解为 Python 的内置 frozenset 数据类型定义的哈希函数背后的机制.实现显示在底部以供参考.我特别感兴趣的是选择这种散射操作的基本原理: lambda h: (h ^ (h
..
由于 Python 3.6 中 dict 实现的变化,现在默认排序.sets 现在也保留顺序吗? 我找不到任何有关它的信息,但由于这两种数据结构在它们的底层工作方式上非常相似,我认为可能是这种情况. 我知道 dict 不能在所有情况下都被订购,但大多数情况下都是如此.如 Python 文档中所述: 这个新实现的顺序保留方面被认为是一个实现细节,不应依赖 解决方案 不,se
..
如果复合对象的某些部分仍然被引用,python 垃圾收集器是否会清理它 例如 def foo():A = [ [1, 3, 5, 7], [2, 4, 6, 8]]返回 A[1]B = 富() A[0] 会被垃圾回收吗? 有没有办法通过代码确认? 解决方案 Nothing 引用列表 A 和嵌套列表 A[0],所以是的,它们会从内存中删除. A[1] 引用的嵌套列表对象
..
我可以从同名函数调用全局函数吗? 例如: def 排序(服务):return {sorted}(服务,key=lambda s: s.sortkey()) {sorted} 我的意思是全局排序函数.有没有办法做到这一点?然后我想用模块名称调用我的函数:service.sorted(services) 我想使用相同的名称,因为它与全局函数做同样的事情,只是它添加了一个默认参数.
..
在 64 位系统上,Python 中的整数占用 24 个字节.这是例如所需内存的 3 倍.C 表示 64 位整数.现在,我知道这是因为 Python 整数是对象.但是额外的内存有什么用呢?我有我的猜测,但很高兴知道. 解决方案 请记住,Python int 类型没有像 C int 那样的有限范围;唯一的限制是可用内存. 内存用于存储值、整数存储的当前大小(存储大小可变以支持任意大小)
..
为什么在 Python 中出现以下异常行为? >>>一个 = 256>>>乙 = 256>>>a 是 bTrue # 这是预期的结果>>>一个 = 257>>>乙 = 257>>>a 是 bFalse #这里发生了什么?为什么这是假的?>>>257 是 257True # 然而文字数字比较正确 我使用的是 Python 2.5.2.尝试一些不同版本的 Python,似乎 Python 2.3.
..