0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解Python的for和while循环

python爬虫知识分享 来源:python爬虫知识分享 作者:python爬虫知识分享 2022-06-24 16:02 次阅读

Python 的 for 和 while 循环是灵活并且高级的,语法自然、读起来像伪代码。而 Cython 也支持 for 和 while,无需修改。但由于循环通常占据程序运行时的大部分时间,因此我们可以通过一些优化,确保 Cython 能够将 Python 循环转换为高效的 C 循环。

n=100
foriinrange(n):
 ...

上面是一个标准的 Python for 循环,如果这个 i 和 n 是静态类型,那么 Cython 就能生成更快的 C 代码。

cdef Py_ssize_t i, n = 100
for i in range(n):
    ...
# 这段代码和下面的C代码是等效的
"""
for (i=0; i

所以当通过 range 进行循环时,我们应该将 range 里面的参数以及循环变量换成 C 的整型。如果不显式地进行静态声明的话,Cython 就会采用最保守的策略:

cdef Py_ssize_t n = 100
for i in range(n):
    print(i + 2 ** 100)

在循环的时候,如果我们使用了变量 i,那么在和一个数字相加的时候,由于 Cython 无法确定是否会发生溢出,因此会保守的选择 Python 的整型。

如果我们能保证表达式中一定不会发生溢出,那么可以显式地将 i 也声明为 C 的整数类型。

当然不光是整型,其它的 Python 类型也可以提前声明,举个例子:

cdef list lst = [
    {"name": "satori", "age": 17},
    {"name": "koishi", "age": 16},
    {"name": "marisa", "age": 15},
]

# lst 里面都是字典,在遍历之前可以提前声明好
cdef dict item
for item in lst:
    print(f"{item['name']}, {item['age']}")
"""
satori, 17
koishi, 16
marisa, 15
"""

# 通过 cdef dict item 提前声明循环变量的类型
# 然后遍历以及操作的时候,速度会快很多
# 因为我们实现了基于类型的优化

以上是 for 循环,至于 while 循环也是同理,说白了还是规定好类型,实现基于类型的优化。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 循环
    +关注

    关注

    0

    文章

    92

    浏览量

    15955
  • C代码
    +关注

    关注

    1

    文章

    89

    浏览量

    14287
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84449
收藏 人收藏

    评论

    相关推荐

    Python代理技术详解:从入门到进阶

    Python代理技术是一种在网络编程中广泛使用的技术,它允许通过代理服务器发送和接收网络请求。
    的头像 发表于 11-12 07:06 163次阅读

    求助,While循环和事件结构问题,内有程序文件

    *附件:测试.zip大家好,我设计了一个可以实现控制While循环的程序,如图 当开关打开时While循环启动,Add按钮按一下指示器就加1,当开关关闭时
    发表于 09-20 15:45

    求助,结束while循环后会跳转至循环前继续执行的问题求解?

    , %drn", i, j); }在上位机中根据输出数字显示波形,其波形如下: 在跳出while循环后其会跳转至循环前继续执行两次,最终在第三次正常结束。 本人才疏学浅,初次遇到这种情况,真诚求助
    发表于 05-22 06:04

    为什么while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET)死循环

    为啥while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET)死循环
    发表于 05-14 06:01

    聊聊MCU死循环,用for(;;)还是while(1)?

    首先,问大家一个问题:你们写单片机程序【死循环】时,喜欢用for(;;)还是while(1)?快来为你喜欢用的【死循环】打call,评论区等你哦~一位工程师发现,国外工程师在给demo在做死
    的头像 发表于 04-29 08:10 1208次阅读
    聊聊MCU死<b class='flag-5'>循环</b>,用for(;;)还是<b class='flag-5'>while</b>(1)?

    STM32 RTX CAN封装库中while循环无法跳出是为什么?

    ptr_CAN-&gt;MCR = CAN_MCR_RESET; // Reset CAN controller while ((ptr_CAN-&gt
    发表于 04-19 07:58

    STM8S003中主函数中执行完while(1)自动跳出循环是怎么回事?

    ();/*LCD显示*/ } } 在上面这段主函数的代码中,如果不加看门狗IWDG_FEED,程序执行完while(1)后就会自动跳出,为什么会非要加看门狗才不会跳出while(1)?不应该是不加IWDG_FEED也不会退出
    发表于 04-18 07:52

    为何国外工程师偏爱使用for(;;)来实现MCU死循环

    一位工程师发现,国外工程师在给demo在做死循环时用的是for(;;),而不是常用的while(1)。这仅仅是个人习惯的问题,还是有更深层次的含义?
    发表于 04-01 11:26 588次阅读
    为何国外工程师偏爱使用for(;;)来实现MCU死<b class='flag-5'>循环</b>?

    TC275屏蔽掉GPIO_DEMO函数后while循环不在执行怎么解决?

    ;gt; 10000000)babywen = 0; } return (1);}屏蔽掉GPIO_DEMO(IO翻转)函数后while循环不在执行(依据是变量观测未发生变化),不屏蔽的时候一切正常
    发表于 02-19 08:22

    arduino中while循环怎么跳出

    Arduino 是一款开源的硬件平台,广泛应用于各种物联网和嵌入式系统项目。在 Arduino 上编写代码时,循环结构起到了至关重要的作用。而其中的 while 循环更是常用于需要根据特定条件重复
    的头像 发表于 02-14 16:22 2387次阅读

    循环指令loop规定循环次数

    循环指令是计算机编程中非常重要的概念,它允许程序重复执行一段代码块,使得程序可以更有效地处理大量数据和重复性任务。在本文中,我们将详尽、详实、细致地介绍循环指令的相关概念、语法和应用场
    的头像 发表于 02-14 16:10 1471次阅读

    TC275操作I2C读操作时陷入while循环无法退出怎么解决?

    TC275作为主芯片,通过I2C读取EEPROM芯片数据,在调用iLLD库的IfxI2c_I2c_read函数时,偶发程序卡在以下while循环中无法退出。 发现是PIRQSS寄存器的RX位一直
    发表于 02-02 06:52

    python中open函数的用法详解

    python中open函数的用法详解 Python中的open()函数用于打开文件。它接受文件名和模式作为参数,并返回一个文件对象。文件对象可用于读取、写入和管理文件。 open()函数的基本语法
    的头像 发表于 01-30 15:31 1948次阅读

    加速Python for循环的12种方法

    Python内建的一个常用功能是timeit模块。下面几节中我们将使用它来度量循环的当前性能和改进后的性能。
    的头像 发表于 01-04 17:33 1879次阅读
    加速<b class='flag-5'>Python</b> for<b class='flag-5'>循环</b>的12种方法

    如何让python运行完后不退出

    Python是一门非常灵活和强大的编程语言,广泛应用于各种领域。许多Python程序都需要保持在后台运行,而不是在执行完毕后立即退出。本文将介绍如何实现这一目标。 一、使用input函数
    的头像 发表于 11-29 15:12 8057次阅读