首先要说明的一点是:C代码效率优于python代码,这已经是常识。同时,Python 底层的解释器和内置函数是用 C 语言实现的。
实际上,在每次循环中,while
会比for
多执行两步操作:边界检查和变量i
的自增。即:while i < n
和i += 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()
运行结果:
可以看到,试验的结果证实了上面的结论。
依然使用上面的例子,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()
运行结果:
可以看到,sum()
执行求和最快!这是因为sum()
函数是内置函数,它是用c语言进行循环的,因此它比前面的while
和for
效率更高。
为了解决等差数列求和这个问题,我们除了粗暴循环还有什么好的方法吗?掌握基础的数学知识就可以知道:
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()
运行结果:
效率又提升了,原因很明显,我们只用一步操作就得到了结果,避免了成千上万次的循环(不管是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...