object.__init__
cpython 存储库位于哪里?__init__
我在 中搜索Objects/object.c
,但没有给出任何结果。
看来所有不可变数据类型都使用object.__init__
,所以我想知道它的实现。
我有一个C扩展模块,我想添加一些Python实用程序函数.有推荐的方法吗?
例如:
import my_module
my_module.super_fast_written_in_C()
my_module.written_in_Python__easy_to_maintain()
Run Code Online (Sandbox Code Playgroud)
我主要对Python 2.x感兴趣.
新的dict
是如此惊人,我预计人们将开始使用它们 - 索引作为一切的关键.他们应该吗?如果没有,为什么不呢?
我一直在关注python字典实现的非常令人兴奋的(对我而言)开发/更改.总结:实现已经改变,现在保留了字典的顺序,现在它们更紧凑/更高效:
https://twitter.com/raymondh/status/773978885092323328?lang=en
此外:看起来永久性的订单保存虽然目前无法保证,但不可避免.
我的问题是:鉴于内存效率得到了极大的提高,订单得以保留,并且你得到更快的项目删除/插入a dict
,是否有任何充分的理由不使用字典来处理任何项目序列,使用索引作为键?
扩展问题:更改底层序列(list
和tuple
)实现以使用与保留顺序相同的技术dict
(再次:使用索引作为键/哈希)是否有意义?
对于那些参加过一些计算机科学课程的人来说,这个问题的答案可能非常明显.我只是一个doofus土木工程师(一点点自嘲幽默对灵魂有益),所以要温柔.
编辑:
我也意识到,dict
当前形式的实用性需要扩展一点,以提供所有的铃声/口哨声list
.目前缺少的一些东西包括insert
方法,reverse
方法和切片(当然,功能上的巨大漏洞).但是这些是添加到一个完整的有序dict
对象是有意义的事情.
或者,也许添加一个dlist
或者ldict
,对于只接受密钥的collections
模块,以及所有缺少的功能都是有用的.更多的内存使用,但更快的修改.dict
int
list
有人可以向我解释为什么 CPython 没有像循环不变优化这样的循环优化吗?例如:
for i in range(100000000000):
pass
Run Code Online (Sandbox Code Playgroud)
cpython 不会跳过循环并需要一些时间来完成执行;这也会发生在 while 循环中。
我是Google Cloud Functions的新手。我想编写一个小型但执行密集的应用程序。我研究了文档,目前尚不清楚在部署到Google Cloud Functions时是否可以使用PyPy或CPython。
pypy cpython python-3.x google-cloud-platform google-cloud-functions
在下面,我可以看到在 python 中添加一个整数时,它添加了整数,将该结果值分配给一个新的内存地址,然后将变量设置为指向该内存地址:
>>> a=100
>>> id(a)
4304852448
>>> a+=5
>>> id(a)
4304852608
Run Code Online (Sandbox Code Playgroud)
有没有办法查看(旧)内存地址 4304852448 (0x10096d5e0) 处的值是多少?例如:value_of(0x10096d5e0)
当我PyRun_SimpleString(...)
用 C++ 调用并且我的 Python 脚本包含无效语法或错误时,我会收到一条错误消息,该消息会打印到我的控制台。
如何阻止该错误消息刷新到控制台,而是以字符串或a 的形式获取该错误消息const char*
,并可能以我自己的方式使用该字符串(将其显示为 GUI 文本或其他内容)?
CPython 3.8
class Class: pass
s = set(
id(Class())
for _ in range(5)
)
len(s) == 1 # True
Run Code Online (Sandbox Code Playgroud)
似乎这是一种解释器魔术,它肯定与垃圾收集有关。它是特定于 CPython 的,不受任何标准行为的保证吗?
让我们在 Haskell 中使用一些有限递归数据结构。例如。
data Tree = Node Tree Tree | Nil
Run Code Online (Sandbox Code Playgroud)
我需要能够将这样的数据结构从 Haskell 加载到 Python,更改它并将其返回到 Haskell。
有没有一些标准/优雅的方法可以在没有太多痛苦的情况下做到这一点?例如。使用一些目录之类的对象?
当我遇到len函数的C实现时,我正在阅读有关python内置函数的实现的信息。
static PyObject *
builtin_len(PyObject *module, PyObject *obj)
/*[clinic end generated code: output=fa7a270d314dfb6c input=bc55598da9e9c9b5]*/
{
Py_ssize_t res;
res = PyObject_Size(obj);
if (res < 0) {
assert(PyErr_Occurred());
return NULL;
}
return PyLong_FromSsize_t(res);
Run Code Online (Sandbox Code Playgroud)
我无法理解这段代码中发生了什么。我不知道C是如何工作的。有人可以解释这段代码在做什么吗?
我从https://github.com/python/cpython/blob/master/Python/bltinmodule.c获取了代码
编辑:我只是很好奇len函数是如此之快,在这段代码中绊倒了。我只想知道为什么使用函数PyObject_Size检查对象的大小为零,然后使用PyLong_FromSsize_t返回实际大小。
cpython ×11
python ×9
c ×2
python-3.x ×2
c++ ×1
clion ×1
compilation ×1
embed ×1
haskell ×1
haskell-ffi ×1
optimization ×1
pypy ×1