问题标签 [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 - Python 的 List 是如何实现的?
是链表还是数组?我四处寻找,只发现人们在猜测。我的 C 知识还不够好,无法查看源代码。
python - Python 对象以什么结构存储在内存中?
假设我有一个 A 类:
我sys.getsizeof
用来查看需要多少字节实例A
:
如上面的实验所示,一个A
物体的大小无论如何self.x
都是一样的。
所以我想知道python如何在内部存储一个对象?
python - 确定给定的 Python 模块是否为内置模块
我正在对各种模块进行一些解析和自省,但我不想解析内置模块。现在,内置模块没有像 a 这样的特殊类型types.BuiltinFunctionType
,那么我该怎么做呢?
根据 Python,如果一个模块没有__file__
属性,它显然是内置的。这是否意味着这hasattr(SomeModule, '__file__')
是检查模块是否内置的方法?当然,它并不完全常见del SomeModule.__file__
,但是有没有更可靠的方法来确定模块是否是内置的?
python - 为什么 Python 中每个新对象的 refs 都会增加 2?
在定义新对象后,交互环境中的 refs 数量增加 2 对我来说有点奇怪。我只创建了一个对象,不是吗?
python - 列表查找比元组更快?
过去,当我需要在紧密循环中进行类似数组的索引查找时,我通常使用元组,因为它们通常看起来非常高效(接近只使用 n 个变量)。然而,我今天决定质疑这个假设,并得出了一些令人惊讶的结果:
元组查找似乎比列表查找花费 17% 的时间!重复的实验给出了类似的结果。拆开每个,我发现它们都是:
作为参考,典型的 10,000,000 个全局变量查找/返回需要 2.2 秒。另外,我在没有 lambda 的情况下运行它,你知道,以防万一(请注意,数字 = 100,000,000 而不是 10,000,000)。
在这里,元组查找需要 35% 的时间。这里发生了什么?对于非常紧凑的循环,这实际上似乎是一个显着的差异。这可能是什么原因造成的?
请注意,对于分解为变量(例如 x,y=t),元组稍微快一些(在我的几次测试中减少了约 6% 的时间),对于从固定数量的参数进行构造,元组更快(减少了约 83% 的时间) )。不要将这些结果作为一般规则;我刚刚执行了一些对大多数项目来说毫无意义的小测试。
python - del 在 Python 中什么时候有用?
我真的想不出 Python 需要del
关键字的任何原因(而且大多数语言似乎没有类似的关键字)。例如,与其删除一个变量,不如直接赋值None
给它。并且从字典中删除时,del
可以添加一个方法。
是否有保留del
Python 的理由,或者它是 Python 垃圾收集前的遗迹?
python - 为什么 Python 在使用 from-imports 时对循环导入更严格?
我知道 Python 不鼓励任何可能使您进入循环导入的情况。但我想了解 Python 的内部原理,为什么 from-imports 在循环导入情况下似乎比正常导入更不宽容。
例如,此代码编译:
但是这段代码没有:
只要您在所有导入完成之前不尝试使用相关类,就不会遇到编译器错误。但是当你尝试做一些混叠时,它就会失败。有人可以解释一下 Python 内部发生了什么,导致这个错误只有在使用 from-import 时才会出现?其次,有什么简单的方法可以解决这个问题吗?(除了明显的“将共享代码拉到第三个模块”之外,无论如何我都可能会这样做。)
python - Python:为什么 * 和 ** 比 / 和 sqrt() 快?
在优化我的代码时,我意识到以下几点:
并且:
我认为这与在 C 中实现 python 的方式有关,但我想知道是否有人愿意解释为什么会这样?
python - 为什么从过滤器创建集合比创建列表或元组快得多?
我正在filter
一个可交互的设备上运行,并希望将结果存储在一个序列中(我需要一个序列以便我可以使用random.choice
它)。我注意到从过滤器对象创建集合比创建列表或元组快得多。这是为什么?我首先认为过滤器类型是集合的子类型,这可以解释这一点,但该函数实际上与生成器表达式相同,因此它在内部不能真正成为集合。filter
我运行了以下测试来检查速度:
结果清楚地说明了使用集合:
那么为什么从过滤器创建一个集合的速度如此之快呢?它通常不应该像从序列中创建一个集合一样长,其中每个元素都必须被散列吗?或者它是否以某种方式从内部过滤器表示中得到了提升?
相比之下,在对range
表达式运行测试时,所需时间大约是和set
的两倍(两者的速度几乎相同)。list
tuple
编辑:
Sven 的回答是完全正确的,但为了完整性,更新的测试将在实际过滤器上运行:
结果实际上显示了什么更有意义,list
并且tuple
两者都是最快的,尽管 set 并不是真的很慢,所以使用什么不会有任何区别:
python - 如何将 Python 对象存储在内存中以供不同进程使用?
情况如下:我有一个巨大的对象需要加载到内存中。如此之大,以至于如果它被加载两次,它将超出我机器上的可用内存(不,我无法升级内存)。我也不能把它分成任何更小的部分。为简单起见,假设对象为 600 MB,而我只有 1 GB 的 RAM。我需要从在多个进程中运行的 Web 应用程序中使用此对象,并且我无法控制它们的生成方式(第三方负载均衡器会这样做),因此我不能仅仅依赖于创建对象在一些主线程/进程中,然后产生子进程。这也消除了使用诸如 POSH 之类的东西的可能性,因为这依赖于它自己的自定义 fork 调用。我也不能使用诸如 SQLite 内存数据库、mmap 或 posix_ipc 之类的东西,sysv_ipc 和 shm 模块,因为它们充当内存中的文件,并且这些数据必须是我使用它的对象。使用其中一个我必须将其作为文件读取,然后将其转换为每个单独进程和 BAM 中的对象,由于我只是试图加载第二个副本,因此超出机器的内存限制会导致分段错误。
必须有某种方式将 Python 对象存储在内存中(而不是作为文件/字符串/序列化/腌制)并使其可以从任何进程访问。我只是不知道它是什么。我已经查看了 StackOverflow 和 Google,但找不到答案,所以我希望有人能帮助我。