python循环性能pk

在任何一种编程语言中,循环都是非常消耗时间的操作。假设任意一种简单的单步操作耗费的时间是1个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。众所周知,python不是一种执行效率较高的语言,因此,我们对于python语言里的循环性能更加关注。

for while

while for 是python中常用的两种实现循环的方法,但它们的运行效率实际上是有差距的。使用下面的测试代码:

import timeit
def while_loop(n=100):
    i = 0
    s = 0
    while i < n:
        s += i
        i +=1
    return s
def for_loop(n=100):
    s = 0
    for i in range(n):
        s += i
    return s
def main():
    print('while loop:', timeit.timeit(while_loop, number=100))
    print('for loop:', timeit.timeit(for_loop, number=100))
if __name__ == '__main__':
    main()

运行结果:

# while loop: 0.11076588099240325
# for loop: 0.03892302500025835

可以看到:一个简单的求和的循环,for循环要比while循环快很多。

是什么导致这样的差距?

首先要说明的一点是:C代码效率优于python代码,这已经是常识。同时,Python 底层的解释器和内置函数是用 C 语言实现的

实际上,在每次循环中,while会比for多执行两步操作:边界检查和变量i的自增。即:while i < ni += 1,并且这两步都是显示的纯python脚本。相比之下,for循环不需要这两步额外的依赖于python脚本的操作,因此效率优于while循环,并且随着循环次数不断增加,二者的运行效率差距也越来越大。

为了证实以上的解释,我们做如下的试验:

import timeit
def while_loop(n=100):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s
def for_loop(n=100):
    s = 0
    for i in range(n):
        s += i
    return s
def for_loop_with_inc(n=100):
    s = 0
    for i in range(n):
        s += i
        i += 1
    return s
def for_loop_with_test(n=100):
    s = 0
    for i in range(n):
        if i < n:
        s += i
    return s
def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=10000))
    print('for loop\t\t', timeit.timeit(for_loop, number=10000))
    print('for loop with increment\t\t',
          timeit.timeit(for_loop_with_inc, number=10000))
    print('for loop with test\t\t', timeit.timeit(for_loop_with_test, number=10000))
if __name__ == '__main__':
    main()

运行结果:

# while loop		 0.08734580200689379
# for loop		 0.039982129994314164
# for loop with increment		 0.04891946600400843
# for loop with test		 0.04814562000683509

可以看到,试验的结果证实了上面的结论。

依然使用上面的例子,python里有一个内置的函数sum()可以求和,我们来对比下sum()和循环的效率。

import timeit
def while_loop(n=100):
    i = 0
    s = 0
    while i < n:
        s += i
        i += 1
    return s
def for_loop(n=100):
    s = 0
    for i in range(n):
        s += i
    return s
def sum_range(n=100):
    return sum(range(n))
def main():
    print('while loop\t\t', timeit.timeit(while_loop, number=10000))
    print('for loop\t\t', timeit.timeit(for_loop, number=10000))
    print('sum range\t\t', timeit.timeit(sum_range, number=10000))
if __name__ == '__main__':
    main()

运行结果:

# while loop		 0.052548438994563185
# for loop		 0.0333536260004621
# sum range		 0.00758898000640329

可以看到,sum()执行求和最快!这是因为sum()函数是内置函数,它是用c语言进行循环的,因此它比前面的whilefor效率更高。

为了解决等差数列求和这个问题,我们除了粗暴循环还有什么好的方法吗?掌握基础的数学知识就可以知道: def main(): print('while loop\t\t', timeit.timeit(while_loop, number=10000)) print('for loop\t\t', timeit.timeit(for_loop, number=10000)) print('sum range\t\t', timeit.timeit(sum_range, number=10000)) print('math sum\t\t', timeit.timeit(math_sum, number=10000)) if __name__ == '__main__': main()

运行结果:

# while loop		 0.060537102006492205
# for loop		 0.03300404299807269
# sum range		 0.007836175005650148
# math sum		 0.0013752939994446933

效率又提升了,原因很明显,我们只用一步操作就得到了结果,避免了成千上万次的循环(不管是python还是c),代码的效率自然达到了空前的提升。

经过以上的测试,我们得到了最终的结论:实现循环的最快方式,就是不用循环。如果无法完全的避免循环,那么尽量使用python的内置函数,并且减少循环中的纯python脚本。

利用内置函数:使用内置函数可以加速代码的执行,例如 map() 和 filter()。 避免不必要的循环:如果可以直接使用列表推导式或生成器表达式代替 for 循环,则应该使用它们。 利用预先计算:如果可以预先计算某些值,则应该尽量预先计算。 减少循环次数:应该尽量减少循环的次数,例如,使用 while 循环代替 for 循环。 本篇文章给大家带来的内容是关于Python循环的技巧介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。当在字典中循环时,用 items() 方法可将关键字和对应的值同时取出>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}>>> for k, v in knight... do while 循环和while 循环有区别 do while 循环比while 循环是一定会多一次循环 do while 循环是无论是否符合条件先进行循环再进行判断, 但是while 循环是假如不成立就不进行循环。 for循环可以使用局部的变量和外部变量,而while循环终止是必须使用 外部变量。 另外从循环的已知数量可以想,for使用在已知循环次数的循环里面 while是使用在未知循环次数。这个在我的另一篇文章字符串计算 大家都知道,效率不管是对于工作还是学习都是十分重要的。当然,Python也是需要效率的。众所周知,Python 不是一种执行效率较高的语言。此外在任何语言中,循环都是一种非常消耗时间的操作。假如任意一种简单的单步操作耗费的时间为 1 个单位,将此操作重复执行上万次,最终耗费的时间也将增长上万倍。while 和 for 是 Python 中常用的两种实现循环的关键字,它们的运行效率实际上是有差距的。比如下面的测试代码: 这是一个简单的求和操作,计算从 1 到 n 之间所有自然数的总和。可以看到 for 循环相 之前一直以为由于数组循环的预读机制,a的速度是更快的。但是通过实践发现b更快。而对于1000,1000的数组,先计算第二维就会稍快一点点,但也快的不太多。猜想可能是1000000和5差距太大了,就更倾向于让循环多的放在内循环。但是为什么循环多的放在内循环就快呢? 问题描述死循环或者非常大的循环程序运行一段时间后发现占用CPU和内存巨大,两个程序占用8核16G阿里ECS机器中的60%内存和CPU。程序作用一个程序是从阿里redis中取zset数据然后消费删除。一个程序是订阅redis中的一个消息,也是简单的消费。主要代码$redisQueue = new WechatFollowServices();//3600 * 26小时$time1 = 93600;/... 01 在列表里面计数 性能:第二种计数方法比第一种快不要太多,因为Python原生的内置函数都是优化过的,所以能用原生的计算的时候,尽量用原生的函数来计算,所以能用原生的内置的数据结构,一定要用原生的(集合set去重也类似)。 02 过滤一个列表 性能:第二种方法有可能比第一种慢,有人可能觉得filter应该会快一些,其实filter增加了复杂度,返回一个迭代对象再用list转化为一个列表,所以开... Python是当今最受欢迎的编程语言之一。这是一种具有优雅且易读语法的解释性高级语言。但是,Python通常比Java,C#尤其是C,C ++或Fortran慢得多。有时性能问题和瓶颈可能会严重影响应用程序的可用性。幸运的是,在大多数情况下,有一些解决方案可以提高Python程序的性能开发人员可以选择提高其代码速度。例如,一般建议是使用经过优化的Python内置或第三方例程,这些例程通... 对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢?思路很简单:就是循环33210000条记录,将每辆车的数据搬运到它该去的文件中。但是对于3000多万条数据,一个一个循环太消耗时间,我花了2个小时才搬运了60万数据,算算3000万我需要花费100个小时,也就需要4-5天。并且还需要保证这五天全天开机,不能出现卡机的事故。因此,需要使用并行... 本专栏招募作者及编辑,感兴趣分享学习R/Python数据分析/机器学习知识的可以私信联系PS:有人提到一个问题很好,如果每次循环都采用比较复杂的操作似乎用向量化很难实现,我的建议是尽可能拆分成向量化操作,如果不行建议用numpy硬写然后用numba包加速。正文:如果你使用过Python及Pandas,那么你很有可能已经使用了for循环去进行某些数据分析操作。不幸的是,绝大部分Python新手使用的... 1.在for循环中,循环控制变量的初始化和修改都放在语句头部份,形式较简洁,且特别适用 于循环次数已知的情况,比如:遍历列表,打印有规律的一组数等 2.在while循环中,循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在 循环体中,形式上不如for语句简洁,但它比较适用于... 我有一个像这样的熊猫数据帧。。在order_id buyer_id scheduled_order minutes flag525 232 1 13 Null862 232 1 14 Null1361 232 1 15... 如果说最近最火的语言和最古老的语言碰撞会产生什么样的火花呢?在刚刚上大学的小伙伴肯定是有这样的疑问,C语言作为比较古老和底层的语言,一般是作为大学生的必修课,也是计算机课程的第一课,而Python作为高级语言,随着这几年的机器学习、人工智能彻底火出圈了,外行的人也知道Python很牛,那么这最古老的语言和最火的语言之间的区别是什么呢?我们应该如何选择最适合自己的语言呢? 一、语言类型不同 C语言是比较古老的语言,并没有太多高级语言的特性,在语言类型上他属于编译型语言,何为编译型语言,编译型语言就是经过了软件 我们可以让Python for循环更快。在海报的问题是,为什么Python“for loops”相对于C#和JavaScript这么慢。这并不是通过提出一种不同的算法来解决的,这种算法可以减少对“for循环”的需要(尤其是因为C和JavaScript版本使用修改后的算法也会更快)。一般来说,编程语言是使用相似的算法进行比较的,这些算法的区别是由语言特性实现的,这些特性允许它们在任务中表现出色htt...