当前位置: 首页 > 面试题库 >

如何在CPython中实现生成器和协程?

聂涛
2023-03-14
问题内容

我已经读过在CPython中,解释器堆栈(为此目的而调用的Python函数的列表)与C堆栈(在解释器自己的代码中调用的C函数的列表)混合在一起。如果是这样,那么如何实现生成器和协程?他们如何记住执行状态?CPython是否将每个生成器/协程的堆栈复制到OS堆栈或从OS堆栈复制?还是CPython只是将生成器的最高堆栈帧保留在堆上,因为生成器只能从该最高帧产生?


问题答案:

yield指令将当前正在执行的上下文作为闭包,并将其转换为自己的活动对象。该对象具有__iter__在yield语句之后将继续的方法。

因此,调用堆栈将转换为堆对象。



 类似资料:
  • 问题内容: 我一直在尝试学习如何在场景下实现CPython。Python是高级的,这很好,但是我不喜欢将其视为黑匣子。 考虑到这一点,元组如何实现?我已经看过源代码(tupleobject.c),但它已经超出我的头了。 我看到的和,什么是节约型和“自由列表”?(长度为20/21或2000/2001的元组之间会有性能差异吗?是什么导致了最大元组长度的强制执行?) 问题答案: 请注意,此答案中的所有内

  • 问题内容: INFINITE是这里的关键词。 我希望将其用作。我相信这是中的内置函数。 因此,答案不能像“只做筛子”那样幼稚。 首先,你不知道会消耗多少连续的素数。好吧,假设你一次可以炮制100个。你会使用相同的方法以及质数频率公式吗? 问题答案: 菜谱中的功能可以进一步加快(大约20-25%): 该检查验证x为奇数。然而,由于这两个 q和p是奇数,通过添加2*p下列步骤一半避免随着测试古怪。 擦

  • 问题内容: 当前,我有一个效率低下的同步生成器,该生成器按顺序发出许多HTTP请求并产生结果。我想使用请求并使其并行化,从而加快此生成器的速度,但我想将其保留为普通生成器(而不是PEP 525异步生成器 ),以便不需要调用它的非异步代码被修改。如何创建这样的生成器? 问题答案: ,目前几乎没有文献记录,它接受一个协程或期货的迭代,并按输入期货的完成顺序返回一个迭代的期货。 通常 ,您可以从函数内部

  • 需求是列表页操作栏点击导出按钮 然后根据数据详情动态生成PDF 这种一般是前端做还是后端做 如果前端实现是不是画一个页面出来 然后需要跳到页面里 用html导出PDF这方式种实现 有做过的大佬麻烦帮忙解答下谢谢

  • 1. 如何生成一个巨大的序列 1.1 需求描述 要求生成一个包含很多元素的序列,假设: 存储 1 个整数需要 4 个字节 现在要创建一个包含 1 G 个整数的序列,从 0 到 1 * 1024 * 1024 * 1024 - 1 如果需要为序列中的每个整数分配内存,则需要分配的内存为 1G * 4 = 4G 1.2 通过列表推导 Python 提供了列表推导用于生成列表,下面使用列表推导生成一个包

  • 问题内容: 有没有一种方法可以生成可以在JOIN中使用的任意数量的行,类似于Oracle语法: 问题答案: 讨厌这样说,但是这是四大公司中唯一没有此功能的公司。 在: 在(最多行)中: 或使用提示最多 在: 在中,什么都没有。